{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:43.462939Z",
     "start_time": "2019-12-11T16:29:15.682308Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "# import lib\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import xgboost as xgb\n",
    "from sklearn.model_selection import train_test_split, StratifiedKFold, RandomizedSearchCV\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.metrics import roc_auc_score, confusion_matrix, roc_curve, auc\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import balanced_accuracy_score\n",
    "from sklearn.naive_bayes import BernoulliNB\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn import svm\n",
    "from imblearn.ensemble import EasyEnsembleClassifier, BalancedBaggingClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:44.324894Z",
     "start_time": "2019-12-11T16:29:43.466833Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    "mpl.style.use('fivethirtyeight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:45.997020Z",
     "start_time": "2019-12-11T16:29:44.328224Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import KFold\n",
    "from sklearn.metrics import roc_auc_score\n",
    "from xgboost import plot_importance\n",
    "from sklearn.metrics import make_scorer\n",
    "import time\n",
    "from hyperopt import fmin, hp, tpe, Trials, space_eval, STATUS_OK, STATUS_RUNNING"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:46.002589Z",
     "start_time": "2019-12-11T16:29:45.999529Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import gc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:50.106829Z",
     "start_time": "2019-12-11T16:29:46.005359Z"
    }
   },
   "outputs": [],
   "source": [
    "# import data\n",
    "X = pd.read_csv('../data/features/trainX.csv')\n",
    "y = pd.read_csv('../data/features/trainY.csv', header=None)\n",
    "testX = pd.read_csv('../data/features/testX.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:50.177569Z",
     "start_time": "2019-12-11T16:29:50.109221Z"
    }
   },
   "outputs": [],
   "source": [
    "ids = testX.id\n",
    "testX = testX.drop(['id'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:50.664403Z",
     "start_time": "2019-12-11T16:29:50.179770Z"
    }
   },
   "outputs": [],
   "source": [
    "# ROC\n",
    "import matplotlib.pyplot as plt\n",
    "def plotROC(y_test, y_score):\n",
    "    fpr = dict()\n",
    "    tpr = dict()\n",
    "    roc_auc = dict()\n",
    "    fpr[2], tpr[2], _ = roc_curve(y_test, y_score)\n",
    "    roc_auc[2] = auc(fpr[2], tpr[2])\n",
    "\n",
    "    # Compute micro-average ROC curve and ROC area\n",
    "    fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(y_test, y_score)\n",
    "    roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])\n",
    "    # plot it\n",
    "    plt.figure()\n",
    "    lw = 2\n",
    "    plt.plot(fpr[2], tpr[2], color='darkorange',\n",
    "             lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])\n",
    "    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.ylim([0.0, 1.05])\n",
    "    plt.xlabel('False Positive Rate')\n",
    "    plt.ylabel('True Positive Rate')\n",
    "    plt.title('Receiver operating characteristic example')\n",
    "    plt.legend(loc=\"lower right\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:51.822893Z",
     "start_time": "2019-12-11T16:29:50.667448Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.2, stratify=y, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意这里一定要进行分层抽样，否则会仅有的极少数的正样本大部分出现在训练集或者测试集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:29:51.877207Z",
     "start_time": "2019-12-11T16:29:51.825705Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    136.687093\n",
       "dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(y_train == 0) / np.sum(y_train == 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## XGBoost[0.774493]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 简单尝试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:30:54.107387Z",
     "start_time": "2019-12-11T16:30:46.006965Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/shensir/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/label.py:219: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n",
      "/home/shensir/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/label.py:252: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
       "              colsample_bynode=1, colsample_bytree=1, eval_metric='auc',\n",
       "              gamma=0, learning_rate=0.05, max_delta_step=0, max_depth=3,\n",
       "              min_child_weight=1, missing=None, n_estimators=150, n_jobs=-1,\n",
       "              nthread=None, objective='binary:logistic', random_state=42,\n",
       "              reg_alpha=0, reg_lambda=1, scale_pos_weight=136, seed=None,\n",
       "              silent=None, subsample=1, tree_method='hist', verbosity=1)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb_model = xgb.XGBClassifier(objective=\"binary:logistic\", \n",
    "                              random_state=42, \n",
    "                              eval_metric=\"auc\",\n",
    "                              learning_rate=0.05,\n",
    "                              max_depth=3,\n",
    "                              n_estimators=150,\n",
    "                              n_jobs=-1,\n",
    "                              tree_method = 'hist',\n",
    "                              scale_pos_weight=136)  # sum(y == 0) / sum(y == 1)\n",
    "\n",
    "xgb_model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-11T16:37:46.838686Z",
     "start_time": "2019-12-11T16:37:46.245737Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.60129696, 0.39870304],\n",
       "       [0.6826828 , 0.3173172 ],\n",
       "       [0.6293769 , 0.3706231 ],\n",
       "       ...,\n",
       "       [0.6415446 , 0.3584554 ],\n",
       "       [0.3908785 , 0.6091215 ],\n",
       "       [0.6390429 , 0.3609571 ]], dtype=float32)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# XGBoost陷阱：数据结构敏感\n",
    "# https://www.zhihu.com/question/358230968\n",
    "# xgb_model.fit(np.array(X_train), np.array(y_train))\n",
    "# xgb_model.predict_proba(np.array(X_train))\n",
    "# xgb_model.predict_proba(np.array(X_train).tolist())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:00:14.738528Z",
     "start_time": "2019-11-22T17:00:13.157662Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# training auc\n",
    "# roc_auc_score(y_train, xgb_model.predict_proba(X_train)[:,1])\n",
    "plotROC(y_train, xgb_model.predict_proba(X_train)[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:00:14.906710Z",
     "start_time": "2019-11-22T17:00:14.741210Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6991692698397557"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# test auc\n",
    "y_pred = xgb_model.predict_proba(X_test)[:,1]\n",
    "roc_auc_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:00:15.238849Z",
     "start_time": "2019-11-22T17:00:14.909959Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotROC(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:00:15.496666Z",
     "start_time": "2019-11-22T17:00:15.241902Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[18648,  7562],\n",
       "       [   84,   108]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# confusion matrix\n",
    "y_pred_class = xgb_model.predict(X_test)\n",
    "confusion_matrix(y_test, y_pred_class)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:00:15.558197Z",
     "start_time": "2019-11-22T17:00:15.505389Z"
    }
   },
   "outputs": [],
   "source": [
    "def objective(params):\n",
    "    time1 = time.time()\n",
    "    params = {\n",
    "        'max_depth': int(params['max_depth']),\n",
    "        'gamma': \"{:.3f}\".format(params['gamma']),\n",
    "        'subsample': \"{:.2f}\".format(params['subsample']),\n",
    "        'reg_alpha': \"{:.3f}\".format(params['reg_alpha']),\n",
    "        'reg_lambda': \"{:.3f}\".format(params['reg_lambda']),\n",
    "        'learning_rate': \"{:.3f}\".format(params['learning_rate']),\n",
    "        'num_leaves': '{:.3f}'.format(params['num_leaves']),\n",
    "        'colsample_bytree': '{:.3f}'.format(params['colsample_bytree']),\n",
    "        'min_child_samples': '{:.3f}'.format(params['min_child_samples']),\n",
    "        'feature_fraction': '{:.3f}'.format(params['feature_fraction']),\n",
    "        'bagging_fraction': '{:.3f}'.format(params['bagging_fraction'])\n",
    "    }\n",
    "\n",
    "    print(\"\\n############## New Run ################\")\n",
    "    print(f\"params = {params}\")\n",
    "    FOLDS = 5\n",
    "    count = 1\n",
    "    skf = StratifiedKFold(n_splits=FOLDS, shuffle=True, random_state=42)\n",
    "    score_mean = 0\n",
    "    for tr_idx, val_idx in skf.split(X_train, y_train.values.ravel()):\n",
    "        clf = xgb.XGBClassifier(\n",
    "            objective=\"binary:logistic\",\n",
    "            n_estimators=300, random_state=4, verbose=True, \n",
    "            tree_method='hist', \n",
    "            scale_pos_weight=136,\n",
    "            n_jobs=-1,\n",
    "            **params\n",
    "        )\n",
    "\n",
    "        X_tr, X_vl = X_train.iloc[tr_idx, :], X_train.iloc[val_idx, :]\n",
    "        y_tr, y_vl = y_train.iloc[tr_idx], y_train.iloc[val_idx]\n",
    "        \n",
    "        clf.fit(X_tr, y_tr.values.ravel())\n",
    "        score = make_scorer(roc_auc_score, needs_proba=True)(clf, X_vl, y_vl)\n",
    "        score_mean += score\n",
    "        print(f'{count} CV - score: {round(score, 4)}')\n",
    "        count += 1\n",
    "    time2 = time.time() - time1\n",
    "    print(f\"Total Time Run: {round(time2 / 60,2)}\")\n",
    "    gc.collect()\n",
    "    print(f'Mean ROC_AUC: {score_mean / FOLDS}')\n",
    "    del X_tr, X_vl, y_tr, y_vl, clf, score\n",
    "    return -(score_mean / FOLDS)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:00:15.799325Z",
     "start_time": "2019-11-22T17:00:15.568986Z"
    }
   },
   "outputs": [],
   "source": [
    "space = {\n",
    "    # The maximum depth of a tree, same as GBM.\n",
    "    # Used to control over-fitting as higher depth will allow model \n",
    "    # to learn relations very specific to a particular sample.\n",
    "    # Should be tuned using CV.\n",
    "    # Typical values: 3-10\n",
    "    'max_depth': hp.quniform('max_depth', 2, 6, 1),\n",
    "    \n",
    "    # reg_alpha: L1 regularization term. L1 regularization encourages sparsity \n",
    "    # (meaning pulling weights to 0). It can be more useful when the objective\n",
    "    # is logistic regression since you might need help with feature selection.\n",
    "    'reg_alpha':  hp.uniform('reg_alpha', 0.01, 0.4),\n",
    "    \n",
    "    # reg_lambda: L2 regularization term. L2 encourages smaller weights, this\n",
    "    # approach can be more useful in tree-models where zeroing \n",
    "    # features might not make much sense.\n",
    "    'reg_lambda': hp.uniform('reg_lambda', 0.01, 0.4),\n",
    "    \n",
    "    # eta: Analogous to learning rate in GBM\n",
    "    # Makes the model more robust by shrinking the weights on each step\n",
    "    # Typical final values to be used: 0.01-0.2\n",
    "    'learning_rate': hp.uniform('learning_rate', 0.01, 0.2),\n",
    "    \n",
    "    # colsample_bytree: Similar to max_features in GBM. Denotes the \n",
    "    # fraction of columns to be randomly samples for each tree.\n",
    "    # Typical values: 0.5-1\n",
    "    'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1),\n",
    "    \n",
    "    # A node is split only when the resulting split gives a positive\n",
    "    # reduction in the loss function. Gamma specifies the \n",
    "    # minimum loss reduction required to make a split.\n",
    "    # Makes the algorithm conservative. The values can vary depending on the loss function and should be tuned.\n",
    "    'gamma': hp.uniform('gamma', 0.01, .7),\n",
    "    \n",
    "    # more increases accuracy, but may lead to overfitting.\n",
    "    # num_leaves: the number of leaf nodes to use. Having a large number \n",
    "    # of leaves will improve accuracy, but will also lead to overfitting.\n",
    "    'num_leaves': hp.choice('num_leaves', list(range(10, 100, 10))),\n",
    "    \n",
    "    # specifies the minimum samples per leaf node.\n",
    "    # the minimum number of samples (data) to group into a leaf. \n",
    "    # The parameter can greatly assist with overfitting: larger sample\n",
    "    # sizes per leaf will reduce overfitting (but may lead to under-fitting).\n",
    "    'min_child_samples': hp.choice('min_child_samples', list(range(10, 200, 20))),\n",
    "    \n",
    "    # subsample: represents a fraction of the rows (observations) to be \n",
    "    # considered when building each subtree. Tianqi Chen and Carlos Guestrin\n",
    "    # in their paper A Scalable Tree Boosting System recommend \n",
    "    'subsample': hp.choice('subsample', [0.7, 0.8, 0.9, 1]),\n",
    "    \n",
    "    # randomly select a fraction of the features.\n",
    "    # feature_fraction: controls the subsampling of features used\n",
    "    # for training (as opposed to subsampling the actual training data in \n",
    "    # the case of bagging). Smaller fractions reduce overfitting.\n",
    "    'feature_fraction': hp.uniform('feature_fraction', 0.7, 1),\n",
    "    \n",
    "    # randomly bag or subsample training data.\n",
    "    'bagging_fraction': hp.uniform('bagging_fraction', 0.7, 1)\n",
    "    \n",
    "    # bagging_fraction and bagging_freq: enables bagging (subsampling) \n",
    "    # of the training data. Both values need to be set for bagging to be used.\n",
    "    # The frequency controls how often (iteration) bagging is used. Smaller\n",
    "    # fractions and frequencies reduce overfitting.\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:14.596796Z",
     "start_time": "2019-11-22T17:00:15.801170Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                                                    \n",
      "############## New Run ################\n",
      "params = {'max_depth': 5, 'gamma': '0.650', 'subsample': '0.80', 'reg_alpha': '0.042', 'reg_lambda': '0.278', 'learning_rate': '0.046', 'num_leaves': '60.000', 'colsample_bytree': '0.881', 'min_child_samples': '70.000', 'feature_fraction': '0.820', 'bagging_fraction': '0.907'}\n",
      "1 CV - score: 0.6735                                \n",
      "2 CV - score: 0.6872                                \n",
      "3 CV - score: 0.6526                                \n",
      "4 CV - score: 0.6548                                \n",
      "5 CV - score: 0.6647                                \n",
      "Total Time Run: 1.31                                \n",
      "Mean ROC_AUC: 0.6665786596663059                    \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 4, 'gamma': '0.328', 'subsample': '0.90', 'reg_alpha': '0.214', 'reg_lambda': '0.047', 'learning_rate': '0.044', 'num_leaves': '80.000', 'colsample_bytree': '0.816', 'min_child_samples': '10.000', 'feature_fraction': '0.796', 'bagging_fraction': '0.892'}\n",
      "1 CV - score: 0.6819                                                          \n",
      "2 CV - score: 0.7094                                                          \n",
      "3 CV - score: 0.6791                                                          \n",
      "4 CV - score: 0.6911                                                          \n",
      "5 CV - score: 0.674                                                           \n",
      "Total Time Run: 1.37                                                          \n",
      "Mean ROC_AUC: 0.6870882543629604                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 5, 'gamma': '0.584', 'subsample': '0.90', 'reg_alpha': '0.111', 'reg_lambda': '0.190', 'learning_rate': '0.189', 'num_leaves': '50.000', 'colsample_bytree': '0.796', 'min_child_samples': '90.000', 'feature_fraction': '0.863', 'bagging_fraction': '0.924'}\n",
      "1 CV - score: 0.6345                                                          \n",
      "2 CV - score: 0.6263                                                          \n",
      "3 CV - score: 0.5763                                                          \n",
      "4 CV - score: 0.5861                                                          \n",
      "5 CV - score: 0.6262                                                          \n",
      "Total Time Run: 1.32                                                          \n",
      "Mean ROC_AUC: 0.6098614266828566                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 3, 'gamma': '0.689', 'subsample': '0.80', 'reg_alpha': '0.106', 'reg_lambda': '0.340', 'learning_rate': '0.147', 'num_leaves': '90.000', 'colsample_bytree': '0.844', 'min_child_samples': '90.000', 'feature_fraction': '0.992', 'bagging_fraction': '0.814'}\n",
      "1 CV - score: 0.6624                                                          \n",
      "2 CV - score: 0.6871                                                          \n",
      "3 CV - score: 0.6362                                                          \n",
      "4 CV - score: 0.6482                                                          \n",
      "5 CV - score: 0.6525                                                          \n",
      "Total Time Run: 1.08                                                          \n",
      "Mean ROC_AUC: 0.6572650714454532                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 4, 'gamma': '0.114', 'subsample': '0.70', 'reg_alpha': '0.354', 'reg_lambda': '0.291', 'learning_rate': '0.100', 'num_leaves': '60.000', 'colsample_bytree': '0.946', 'min_child_samples': '70.000', 'feature_fraction': '0.968', 'bagging_fraction': '0.876'}\n",
      "1 CV - score: 0.669                                                           \n",
      "2 CV - score: 0.6787                                                          \n",
      "3 CV - score: 0.6349                                                          \n",
      "4 CV - score: 0.6494                                                          \n",
      "5 CV - score: 0.6459                                                          \n",
      "Total Time Run: 1.16                                                          \n",
      "Mean ROC_AUC: 0.6555594239569399                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 3, 'gamma': '0.052', 'subsample': '0.70', 'reg_alpha': '0.136', 'reg_lambda': '0.078', 'learning_rate': '0.057', 'num_leaves': '80.000', 'colsample_bytree': '0.670', 'min_child_samples': '190.000', 'feature_fraction': '0.857', 'bagging_fraction': '0.906'}\n",
      "1 CV - score: 0.6893                                                          \n",
      "2 CV - score: 0.7296                                                          \n",
      "3 CV - score: 0.67                                                            \n",
      "4 CV - score: 0.6913                                                          \n",
      "5 CV - score: 0.678                                                           \n",
      "Total Time Run: 1.05                                                          \n",
      "Mean ROC_AUC: 0.6916401607470669                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 6, 'gamma': '0.424', 'subsample': '0.70', 'reg_alpha': '0.252', 'reg_lambda': '0.282', 'learning_rate': '0.106', 'num_leaves': '10.000', 'colsample_bytree': '0.948', 'min_child_samples': '30.000', 'feature_fraction': '0.809', 'bagging_fraction': '0.860'}\n",
      "1 CV - score: 0.627                                                           \n",
      "2 CV - score: 0.6379                                                          \n",
      "3 CV - score: 0.6073                                                          \n",
      "4 CV - score: 0.5916                                                          \n",
      "5 CV - score: 0.6413                                                          \n",
      "Total Time Run: 1.37                                                          \n",
      "Mean ROC_AUC: 0.6210275183324871                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 5, 'gamma': '0.198', 'subsample': '0.90', 'reg_alpha': '0.157', 'reg_lambda': '0.398', 'learning_rate': '0.113', 'num_leaves': '50.000', 'colsample_bytree': '0.917', 'min_child_samples': '30.000', 'feature_fraction': '0.862', 'bagging_fraction': '0.720'}\n",
      "1 CV - score: 0.657                                                           \n",
      "2 CV - score: 0.6635                                                          \n",
      "3 CV - score: 0.6176                                                          \n",
      "4 CV - score: 0.6034                                                          \n",
      "5 CV - score: 0.6363                                                          \n",
      "Total Time Run: 1.31                                                          \n",
      "Mean ROC_AUC: 0.6355393746664983                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 6, 'gamma': '0.338', 'subsample': '0.90', 'reg_alpha': '0.049', 'reg_lambda': '0.267', 'learning_rate': '0.123', 'num_leaves': '70.000', 'colsample_bytree': '0.981', 'min_child_samples': '110.000', 'feature_fraction': '0.889', 'bagging_fraction': '0.714'}\n",
      "1 CV - score: 0.6345                                                          \n",
      "2 CV - score: 0.6092                                                          \n",
      "3 CV - score: 0.5864                                                          \n",
      "4 CV - score: 0.5762                                                          \n",
      "5 CV - score: 0.6298                                                          \n",
      "Total Time Run: 1.46                                                          \n",
      "Mean ROC_AUC: 0.6072078239805212                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 4, 'gamma': '0.177', 'subsample': '1.00', 'reg_alpha': '0.032', 'reg_lambda': '0.092', 'learning_rate': '0.093', 'num_leaves': '80.000', 'colsample_bytree': '0.609', 'min_child_samples': '130.000', 'feature_fraction': '0.982', 'bagging_fraction': '0.947'}\n",
      "1 CV - score: 0.6677                                                          \n",
      "2 CV - score: 0.6757                                                          \n",
      "3 CV - score: 0.6323                                                          \n",
      "4 CV - score: 0.6322                                                          \n",
      "5 CV - score: 0.6538                                                          \n",
      "Total Time Run: 0.74                                                          \n",
      "Mean ROC_AUC: 0.6523228669883636                                              \n",
      "                                                                               \n",
      "############## New Run ################\n",
      "params = {'max_depth': 6, 'gamma': '0.185', 'subsample': '0.90', 'reg_alpha': '0.047', 'reg_lambda': '0.134', 'learning_rate': '0.116', 'num_leaves': '80.000', 'colsample_bytree': '0.748', 'min_child_samples': '190.000', 'feature_fraction': '0.842', 'bagging_fraction': '0.729'}\n",
      "1 CV - score: 0.6288                                                           \n",
      "2 CV - score: 0.6453                                                           \n",
      "3 CV - score: 0.6013                                                           \n",
      "4 CV - score: 0.601                                                            \n",
      "5 CV - score: 0.632                                                            \n",
      "Total Time Run: 1.44                                                           \n",
      "Mean ROC_AUC: 0.6216918891663042                                               \n",
      "                                                                               \n",
      "############## New Run ################\n",
      "params = {'max_depth': 3, 'gamma': '0.366', 'subsample': '0.80', 'reg_alpha': '0.264', 'reg_lambda': '0.393', 'learning_rate': '0.121', 'num_leaves': '70.000', 'colsample_bytree': '0.812', 'min_child_samples': '170.000', 'feature_fraction': '0.970', 'bagging_fraction': '0.914'}\n",
      "1 CV - score: 0.6736                                                           \n",
      "2 CV - score: 0.6969                                                           \n",
      "3 CV - score: 0.6363                                                           \n",
      "4 CV - score: 0.6518                                                           \n",
      "5 CV - score: 0.6635                                                           \n",
      "Total Time Run: 1.09                                                           \n",
      "Mean ROC_AUC: 0.6644253736473246                                               \n",
      "                                                                               \n",
      "############## New Run ################\n",
      "params = {'max_depth': 5, 'gamma': '0.090', 'subsample': '0.70', 'reg_alpha': '0.100', 'reg_lambda': '0.015', 'learning_rate': '0.034', 'num_leaves': '50.000', 'colsample_bytree': '0.749', 'min_child_samples': '150.000', 'feature_fraction': '0.993', 'bagging_fraction': '0.830'}\n",
      "1 CV - score: 0.6825                                                           \n",
      "2 CV - score: 0.7006                                                           \n",
      "3 CV - score: 0.6604                                                           \n",
      "4 CV - score: 0.671                                                            \n",
      "5 CV - score: 0.6654                                                           \n",
      "Total Time Run: 1.24                                                           \n",
      "Mean ROC_AUC: 0.6759702001351637                                               \n",
      "                                                                               \n",
      "############## New Run ################\n",
      "params = {'max_depth': 3, 'gamma': '0.656', 'subsample': '0.80', 'reg_alpha': '0.243', 'reg_lambda': '0.071', 'learning_rate': '0.020', 'num_leaves': '40.000', 'colsample_bytree': '0.911', 'min_child_samples': '130.000', 'feature_fraction': '0.792', 'bagging_fraction': '0.973'}\n",
      "1 CV - score: 0.7005                                                           \n",
      "2 CV - score: 0.7416                                                           \n",
      "3 CV - score: 0.6959                                                           \n",
      "4 CV - score: 0.7135                                                           \n",
      "5 CV - score: 0.6756                                                           \n",
      "Total Time Run: 1.1                                                            \n",
      "Mean ROC_AUC: 0.705432825658324                                                \n",
      "                                                                               \n",
      "############## New Run ################\n",
      "params = {'max_depth': 4, 'gamma': '0.582', 'subsample': '1.00', 'reg_alpha': '0.073', 'reg_lambda': '0.381', 'learning_rate': '0.151', 'num_leaves': '10.000', 'colsample_bytree': '0.664', 'min_child_samples': '170.000', 'feature_fraction': '0.758', 'bagging_fraction': '0.933'}\n",
      "1 CV - score: 0.6488                                                          \n",
      "2 CV - score: 0.66                                                            \n",
      "3 CV - score: 0.6217                                                          \n",
      "4 CV - score: 0.6117                                                          \n",
      "5 CV - score: 0.6472                                                          \n",
      "Total Time Run: 0.68                                                          \n",
      "Mean ROC_AUC: 0.6378862831627894                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 3, 'gamma': '0.104', 'subsample': '1.00', 'reg_alpha': '0.311', 'reg_lambda': '0.321', 'learning_rate': '0.125', 'num_leaves': '60.000', 'colsample_bytree': '0.909', 'min_child_samples': '110.000', 'feature_fraction': '0.730', 'bagging_fraction': '0.807'}\n",
      "1 CV - score: 0.6815                                                          \n",
      "2 CV - score: 0.7048                                                          \n",
      "3 CV - score: 0.6443                                                          \n",
      "4 CV - score: 0.6577                                                          \n",
      "5 CV - score: 0.6529                                                          \n",
      "Total Time Run: 0.6                                                           \n",
      "Mean ROC_AUC: 0.6682564089863383                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 4, 'gamma': '0.197', 'subsample': '1.00', 'reg_alpha': '0.327', 'reg_lambda': '0.184', 'learning_rate': '0.114', 'num_leaves': '40.000', 'colsample_bytree': '0.805', 'min_child_samples': '130.000', 'feature_fraction': '0.989', 'bagging_fraction': '0.856'}\n",
      "1 CV - score: 0.661                                                           \n",
      "2 CV - score: 0.6788                                                          \n",
      "3 CV - score: 0.6173                                                          \n",
      "4 CV - score: 0.6064                                                          \n",
      "5 CV - score: 0.6377                                                          \n",
      "Total Time Run: 0.68                                                          \n",
      "Mean ROC_AUC: 0.6402658427559034                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 5, 'gamma': '0.158', 'subsample': '0.90', 'reg_alpha': '0.156', 'reg_lambda': '0.075', 'learning_rate': '0.189', 'num_leaves': '30.000', 'colsample_bytree': '0.923', 'min_child_samples': '70.000', 'feature_fraction': '0.740', 'bagging_fraction': '0.897'}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 CV - score: 0.6206                                                          \n",
      "2 CV - score: 0.6234                                                          \n",
      "3 CV - score: 0.5948                                                          \n",
      "4 CV - score: 0.5721                                                          \n",
      "5 CV - score: 0.6213                                                          \n",
      "Total Time Run: 1.32                                                          \n",
      "Mean ROC_AUC: 0.606425962702059                                               \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 4, 'gamma': '0.280', 'subsample': '0.70', 'reg_alpha': '0.103', 'reg_lambda': '0.221', 'learning_rate': '0.190', 'num_leaves': '60.000', 'colsample_bytree': '0.894', 'min_child_samples': '50.000', 'feature_fraction': '0.848', 'bagging_fraction': '0.710'}\n",
      "1 CV - score: 0.6244                                                          \n",
      "2 CV - score: 0.6365                                                          \n",
      "3 CV - score: 0.5934                                                          \n",
      "4 CV - score: 0.6096                                                          \n",
      "5 CV - score: 0.6292                                                          \n",
      "Total Time Run: 1.15                                                          \n",
      "Mean ROC_AUC: 0.6186302353451454                                              \n",
      "                                                                              \n",
      "############## New Run ################\n",
      "params = {'max_depth': 6, 'gamma': '0.688', 'subsample': '0.70', 'reg_alpha': '0.168', 'reg_lambda': '0.127', 'learning_rate': '0.103', 'num_leaves': '20.000', 'colsample_bytree': '0.999', 'min_child_samples': '110.000', 'feature_fraction': '0.933', 'bagging_fraction': '0.813'}\n",
      "1 CV - score: 0.6332                                                          \n",
      "2 CV - score: 0.6494                                                          \n",
      "3 CV - score: 0.6031                                                          \n",
      "4 CV - score: 0.6027                                                          \n",
      "5 CV - score: 0.642                                                           \n",
      "Total Time Run: 1.43                                                          \n",
      "Mean ROC_AUC: 0.6260752421685942                                              \n",
      "100%|██████████| 20/20 [22:58<00:00, 69.24s/it, best loss: -0.705432825658324]\n"
     ]
    }
   ],
   "source": [
    "# Set algoritm parameters\n",
    "best = fmin(fn=objective,\n",
    "            space=space,\n",
    "            algo=tpe.suggest,\n",
    "            max_evals=20)\n",
    "\n",
    "# Print best parameters\n",
    "best_params = space_eval(space, best)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:14.606311Z",
     "start_time": "2019-11-22T17:23:14.599267Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BEST PARAMS:  {'bagging_fraction': 0.9734434050691314, 'colsample_bytree': 0.9111958704779868, 'feature_fraction': 0.7923171042287418, 'gamma': 0.6556407536163212, 'learning_rate': 0.019735040386522542, 'max_depth': 3, 'min_child_samples': 130, 'num_leaves': 40, 'reg_alpha': 0.24259740906632582, 'reg_lambda': 0.07061464676596146, 'subsample': 0.8}\n"
     ]
    }
   ],
   "source": [
    "best_params['max_depth'] = int(best_params['max_depth'])\n",
    "print(\"BEST PARAMS: \", best_params)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:30.549672Z",
     "start_time": "2019-11-22T17:23:14.610850Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XGBClassifier(bagging_fraction=0.9734434050691314, base_score=0.5,\n",
       "              booster='gbtree', colsample_bylevel=1, colsample_bynode=1,\n",
       "              colsample_bytree=0.9111958704779868, eval_metric='auc',\n",
       "              feature_fraction=0.7923171042287418, gamma=0.6556407536163212,\n",
       "              learning_rate=0.019735040386522542, max_delta_step=0, max_depth=3,\n",
       "              min_child_samples=130, min_child_weight=1, missing=None,\n",
       "              n_estimators=300, n_jobs=-1, nthread=None, num_leaves=40,\n",
       "              objective='binary:logistic', random_state=0,\n",
       "              reg_alpha=0.24259740906632582, reg_lambda=0.07061464676596146,\n",
       "              scale_pos_weight=136, seed=None, silent=None, subsample=0.8,\n",
       "              tree_method='hist', verbosity=1)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = xgb.XGBClassifier(\n",
    "    n_estimators=300,\n",
    "    **best_params,\n",
    "    tree_method='hist',\n",
    "    eval_metric=\"auc\",\n",
    "    n_jobs=-1,\n",
    "    scale_pos_weight=136\n",
    ")\n",
    "clf.fit(X_train, y_train.values.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:31.712616Z",
     "start_time": "2019-11-22T17:23:30.552554Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_train_pred = clf.predict_proba(X_train)[:,1]\n",
    "plotROC(y_train, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:32.291565Z",
     "start_time": "2019-11-22T17:23:31.716545Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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EwDZZz9QrqNAG2P43/9+o1evtxg7dgHHjmVz5pm1OH48u9z2oVRVVqtWLZKSkjjnnHO45pprOH78uG/Z5s2bGTZsGD169KBbt2488cQTGGN8y7/77jsGDhxI79696d+/P4888ogdL6FY69evZ/To0XaHUaynn36arl270qNHD77//vtC61x88cUkJSWRlJTEmWeeyYgRIwDrO/LBBx+ka9eu9O3bl3XrrA4pDh8+zJVXXhmU+CtNInMe2QCAuDLKbZtLl+5h8OAPuOmmuezYkUK7drV4//3hfPHFn2nePLHc9qNUVRYbG8uiRYtYunQpNWvW5JVXXgEgKyuL6667jvvuu49Vq1axaNEiVqxY4Vu+adMmxowZw8svv8zy5cv56aefaNWqVbnG5nK5yryNp59+mttvD7zj8vLY5+nYsmULH3/8McuWLeOjjz7i/vvvx+12n1LvywI3ggAAEmFJREFUq6++YtGiRSxatIiePXsybNgwwPoxsW3bNtasWcNzzz3H/fffD0CdOnWoX78+y5Ytq/DXUCkSmePwOhyZ1kCU7prty2WbxhjGjPmRVav2U69eHM8+ewGLF9/ARRe1Ktdmo0qpk3r16sW+ffsAmD17Nr179+b8888HIC4ujhkzZvDss88C+L4027a1ntF0Op3ccsstp2wzPT2du+66i759+9K3b18+++wzABo3Pvl4zmeffcadd94JwJ133sl9993HBRdcwIQJE+jcuXO+s8Ru3bpx8OBBDh8+zMiRIznvvPM477zzCv3CTk9PZ+PGjXTu3BmA1atXM3jwYPr378+QIUNITrbGH3znnXe49tprGTZsGMOHDwfg+eef57zzzqNv37489thjvm2OGDGCAQMG0KdPH954441SHOX85s6dy5VXXkl0dDQtWrSgVatWrF69usj6qampLFiwgKFDh/rWv/baaxERevbsSUpKCvv37wdg6NChzJ49u8wxliT875EZQ7VPB/pmXWUYd+zQoUyMMdSrF4+IMG3auSxZsoe77+5OQoK27FKVX+IrNUqucxrbS7n1eMmVvNxuN/Pnz2fkyJGAdaZw9tln56vTsmVL0tPTSU1NZfPmzQFdspsxYwbVq1dnyZIlAPmSUlH27t3Lt9/+f3vnGh1VlSXgbwMqxISABhpooZmhg6D4oMFgQAwEOzQYQSCMgvia0LaoAwuVoWVm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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_pred = clf.predict_proba(X_test)[:,1]\n",
    "plotROC(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:52.429001Z",
     "start_time": "2019-11-22T17:23:32.294353Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XGBClassifier(bagging_fraction=0.9734434050691314, base_score=0.5,\n",
       "              booster='gbtree', colsample_bylevel=1, colsample_bynode=1,\n",
       "              colsample_bytree=0.9111958704779868, eval_metric='auc',\n",
       "              feature_fraction=0.7923171042287418, gamma=0.6556407536163212,\n",
       "              learning_rate=0.019735040386522542, max_delta_step=0, max_depth=3,\n",
       "              min_child_samples=130, min_child_weight=1, missing=None,\n",
       "              n_estimators=300, n_jobs=-1, nthread=None, num_leaves=40,\n",
       "              objective='binary:logistic', random_state=0,\n",
       "              reg_alpha=0.24259740906632582, reg_lambda=0.07061464676596146,\n",
       "              scale_pos_weight=136, seed=None, silent=None, subsample=0.8,\n",
       "              tree_method='hist', verbosity=1)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# train with all data\n",
    "clf.fit(X, y.values.ravel(), verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:53.689457Z",
     "start_time": "2019-11-22T17:23:52.437417Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7760489431907484"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# train auc\n",
    "y_pred = clf.predict_proba(X)[:,1]\n",
    "roc_auc_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:54.049584Z",
     "start_time": "2019-11-22T17:23:53.694563Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbIAAAEXCAYAAADIosFBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3hUVfrA8e876T10kF5CB+k1NAW7qMtPERQXFVdl0bXhKgJS1LWtddlVsWJX7Ipip/emVEPvTUJ6m5nz++MOYRIImYQkNzN5P8/Dw73nnrn3nTt38t5y5hwxxqCUUkr5K4fdASillFJnQxOZUkopv6aJTCmllF/TRKaUUsqvaSJTSinl1zSRKaWU8muayAKEiDQRESMiiXbH4m9EZKBn3zWoBLFMEZGtdsdRkUTkTRH58SzXUWk+QzuVxb70R5rIzoLnoDGefy4R2Ssis0Skvg3h7AHqActs2LbfEBGniIwuVLwYa9/tr/iI/IuINPAc7wPLcLX/AK4uQQz6GaoCNJGdvQVYX6BGwEigM/BxRQdhjHEZYw4aY/LKczsiElqe6y8NEQk5m9cbY3I9+85dVjFVNme7j8rDiZiMMSnGmOSzWVdV+AxV0TSRnb0TX6B9xpj5wCtAbxGJPVFBREI8t4x2iEi2iGwQkVu9VyIi0SLynIjsEZEcEdkpIhO8ltfxXAEeEZE0EVkkIv29lhe4tehZ/krhYEVkk4g84jV/rYis9cS1U0SeEZEor+W/ishrIjJdRA4Au4vaESLSS0Tmi0iWiCSLyHsiUttr+RQR2SoiI0Vku2ebP4hIk0LrGeKJP0tE9onIGyJSw2v5myLyo4jcISI7gRwRifC87lcROSYiKSIyT0R6eL1uJxAEvHHiStpTXuC2lNf8EM/7yRSRjSJycaE4O4vIUs/nlSQiV3v24cSi9pHndV1F5DsRSRWRdBFZLiI9C9W5QkQ2i0iG5z0leC2rJiLviMhuzz7aIiL3ioic7T7yvPZMx+Iez/+/ePbRzjL43ArcDhORdiIyV0SOe97/JhEZVZLP0FPWXERme95rpoj8JiKXFfPZ3OHZ79mez/QhEQn2LGvh+czu9qrfxhPj30r52ez1HAOvivV34jYR2SXW9+cV8Tpx9Hxur4vI4yJy1BPLKyISXsx7OuN3PCAYY/RfKf8BbwI/es2fA8wDnEBUoXq/ARcATYHhwHHgZs9yAX4FtgNXAs2A/sAtnuURwEbgE6Ab0AJ4CMgB2njqNAEMkOiZ/xuQDIR5xdHDU6elZ360p84or23+Brzt9ZpfgTTgJaAt0KGIfVEXSAXeAzoAiZ51zfeqMwXIABZ63kd3rFuhqwHx1DkPyATuABI8dX7x7Ffx2p+pwGfAuZ7tBQFXAdcArYB2wKvAMaCG53W1PJ/NPzzx1vWUD/TslwaF5tcBF3nieMOzzWqeOpHAAeAroCPQC+v2ViYw8QzHTDvPPnjfsw8SgBFA70L76Dugq+f9rQIWFNrXDwBdsI6n64F04MZCx1xp9lFxx2Jnz775iyeOWmXwub1Jwe/Rb1jHUVvP9i8GLivhZ1gXOAT8iHUsNgeuAC45w2czBdjl2UdNgUuwTtyme9W5Dut71wUI98T6USk/m7eANsDlQDbwLTDLU3YpkAXcXui7mArM9HrdYeDZM/xNGk0x3/FA+Gd7AP78z3PQOD0Haqbni2SAp73qNAXcQOtCr50MrPVMn+95XbcitjMa2AsEFyr/GXjOM92Egoks3vNFuNqr/n+AJV7zO4HbCq2zv2c9J/5g/wr8ATiK2RfTPTGGepWd61lXf8/8FM98C686LT1l53tt7/FC627kqdPJa78fB6KLicnh+RJf51XmBEYXqjeQ0yeyv3jVqeMpu9Azf4vnc4/zqtPaU+dMiextrAR52v3p2UdOPAnCUzbccwyFn2G9zwM/FDo2S7yPfDgWG3iWDyxUXurPjVP/+KYU/owK1fflM5wOHMTrhLKY/RCJ9R2+qFD5DcDxQmVvYH0n3gB2eB8DJfhsDlPwu/INcJSCJ55fALML7eOdQJBX2d+wkmBUEftyJ8V8xwPhn95aPHvLgE5YVzvTgSWA962lblhnuSs9txDSRSQdmIB15grWmXeyMWZlEdvojnWmd7zQOvp5raMAY8xx4EusM7ETzyOuxTrjQ0RqAY2BZwqt81vPKlp4rW6VKf7ZQztgqTEm1yuGdVh/lNp51TtijNnqVecPrC/wiTrdgbsKxbTRs8z7vW4yxqR7ByAiTUXkbbFuX6Zinb3Ged5naaz1ivMQ4MJKaGBdLWwyxqR41dmM9Yf6TLoCPxWzP/cbY454z2MdQ7UBRMQhIg94bhcd9eyj2zj1fZZmHxV3LBal1J/baTwNvOq5lTZFRLqUMBaw3sdiY0yGj/XbYd35+KTQe3gZiPN8X04YBwRjJbmR3sdACT+bXK/5g8AWY0xOobLaBV/GcmOMy2t+ERCGdcVZQAm/434t2O4AAkCW1x/m9SLSHHgR64wdTj6H7IN1xufN+LgNB7AJ65ZHYYXX6W0W8JnngO4LRAMfFIrrH1i3gArb6zXt6x+DsuAAnsC6cinsoNf06WL6Gisp/h3rWU4u1m3M0jZQyT1NmffJn6+f39lu98R2Tmz7XuBB4G5gDdat37uxbkd5q4h9dMLZfG4FGGOmi8i7WLd1zwMmiMiTxpgzPns8Syf27dVYV1uFHfOaboH1GMF4ppd4LfP1syncKMsUUXY2Fxsl+Y77NU1kZW8KsElEXvac1a7ylDcyxnxdxGtWAdVEpFsRZ8Irsc7+Uo0xh0sQy1ysL+C1wCDga+NpHWaMOSQie4BWxpiZJVhnUTYAN4pI6IkzTRE5F+tsf71XvVoi0twYs81TpyVQk5Nn7yuBdt5Xbb4Qq1FBW6xnIHM9ZQ049Yw2F+u5zNnaCIwRkbgTZ+Qi0grrlu6ZrALOFxGHD1e5RekPfGeMef1EgXg1BimKj/uouGPxRJItvA9L9bkVxRizHfgv8F8ReQAYz8k7Hb58hquAW0Qkysersg1Yt+iaGWPmFFXJ00jiA8+/tcAMEVni9b5L9dmUQHcRCfK6KuuD9cxuW+GK5fAdr7T01mIZM8YkYTUAeNQzvxV4HZgpIqM8LZ/OFZGbROSfnpf9jNWM/0OxWqs1FZG+IjLGs/xdrHvx34jIBWK1UOwpIg+KyJVniMWJ9dD8dqwzwrcKVXkIuFOsllntRaSViFwpIi+X4q3/B4gF3vSsKxHr7HyBMWaBV71MrBZn3USkmyemtcBPnuWTgSs8Las6idXy7CKxWk5GnGH7ycARrD9eLUWkN1aDiqxC9XYAg0TkHBGpWYr3ecK7WM/IZolIR7FaHb7m2d6ZrtSexLrV9q5nHzQXq7Vj7xJsewswUEQGed7rI0DP4l6Eb/uouGPxqOd9XyAidUWkmqe8tJ9bAWK1mJwhIud5tt0Z68pso1c1Xz7D/2L9ffvCE39TEblMCrU8PcFzu/Mx4DER+bvnu9BOrBZ/T3hVfQEriY7DevY1H3hfTv68obSfja9qYCXPNiJyKdbjjJfPkKzL8jteaWkiKx9PYX3RB3rm/wY8i3VQbcT6o/1XrJZhGOsJ7KXAHKzWgVuAd7CuVDDGZAMDsM56Tzxo/hTrudyuYmI50TIqhZP3xvGs922sFmyXAcuBFVhXlPtK+oY9z5AuwGoMsALrFtZ64P8KVT2A9ROF2Vi3tDKxGlUYz3p+wbqd1BHrD+pvWPsujVNvvXhv3411W6i55zVvAs95tuftXqznJzux/qiXijEmE6tVWx2s9/uOZ3vpWGf2Rb3ud6yGCbWwWvSt9cTkKuo1pzHd89ovsG5rVcP6A1tczMXuIx+ORTfWbclrsG5NrfGUl+pzOw2n5/28hnU7fS5W68ORXnWK/QyNMQewWiumed7LBqyTSzldfc9rpgP3YD0WWId1fN7t2Q4icg1WK8RrjTHpnn01Gus242Oe1ZTqsymB2Z73tBDrqvBrrFaSRb2nMvuOV2YnmsUqVe5EZApwvTEmYB4yexORxlh/9IYaY76yORwVYETkV2CrMWZMcXWrGn1GplQpicj1WGe2O7Bahz2JdYX8vZ1xKVXVaCJTqvRqAFOB+liNahZh/W4v54yvUkqVKb21qJRSyq9pYw+llFJ+za9uLaakpOjlo1JKBbC4uLgiW5YWRa/IlFJK+TVNZEoppfyaJrIAlpSUZHcIfkP3le90X/lO91XF0ESmlFLKr2kiU0op5dc0kSmllPJrmsiUUkr5tQpJZCLyuogcFpH1RSwXEXlBrFFrf5PSjQirlFKqCqqoK7I3scYUKsrFWGM0JWANefK/CohJKaVUAKiQnj2MMfNFpMkZqlwBzPKM77NUROJFpJ5nTCGllKoaXDk4MvafUuw4vgXJTS31aiUnmaDDqzBhxQ1gfoZ1ODMJ3vU17tjmpV7H6eQ6hbxhP57VOipLF1X1gT1e83s9ZUUmMv19hm90P/lO95XvdF/5LikpCXHnEZ65k5DcPwlyptJw+/NkRiXk14lJWYvDlY2UaHxVeziOrCqT9RgDn/7ehgfmDGblsLNbV2VJZCWWkJBQfKUqLikpSfeTj3Rf+U731UmSeZjg3d8ibufJwrw0gg8swETUJiTpQwiJRPLST3ltaM7hItfrimlScDsYJG03ec0LD7heglhzU3DHNccd3bjU68CdhzumMSbqnNKvA1i/OYO7pmxl2eq0s1rPCZUlke0DGnrNNyDAhuJWSvkfyU4GZwZBxzYQtvYZJPc4Jqw6QUdWIu4831ZSKInl1R+EI/tPXDU7kdf40pMLHKG4anTAhFcHCewG5a7DR1i+Zg21akXywAM9z3p9lSWRfQmME5EPgJ5Aij4fU0pVGGOQjH2E7PyS4L0/E3xgAeLyfXxUd0Rt8hpflj8vzgzc0Q05kBVJ7YYtcVdrizu2KUiJO3YPCH/+mcUnn2zhllvORURo374Wb711GYMGNSImJvSs118hiUxE3gcGAjVFZC/wMBACYIx5CZgDXAJsBTKBGysiLqVUFWIMjpQkcDsJ2/AyIds+xh3TBDAEJW8640vdEXWQ7CM46/Unt8PfMSFRmOBI3NXaQlDRf4j/TEqiepOqexs2K8vJSy+t4dlnV5CamkuzZvEMHtwEgKFDW5TZdiqq1eKIYpYb4O8VEYtSqgrISyf4wCIcx/8g7PcXccc0JfjwslOqBSVvPKXMHd2QvAbn42x8Ca5a3THh1Soi4oDidhs+/HATjz66hL17redggwc3pkGDmHLZXmW5taiUUiUiWUcIX/oQeJ5Vhez6GhNRG0fGqY/XHVknG1aY0FjcUfXBEUJWz+mYsBoAuOMTICisYoIPYPPm7WHixPn8/vsRADp0qMX06f0YOLBRuW1TE5lSqvLKTSNk1xzAa3B44yZy/tjTVpdCScwdVh0TVY/c5tfgqnkurlqdITSuHANWCxbs4fffj1C/fjQTJ/Zh+PA2OBzl+2xQE5lSynbBe38heO+PmJBoq0WgK4fgAwt9em1ek6HkNb0SABMcgat6W3CEnHUTceWbAwfS2bEjhT596gNw551diYsLY8yYc4mIqJgUo4lMKVUxXLk4kjcixiDZRwjevxBH8kZC9hbfq4M7si7Oc/p7FTgx0Q3J7j6lyrYEtFtaWi4vvLCKGTNWERcXxsqVo4mKCiE2Now77uhaobFoIlNKlZvgPT8Qtu5Zgo6uRZyZxdbPTRiJO7ohkpeKs15/TERtXLW6aLKqRJxON7Nmredf/1rKkSPWZ3r++U3IyMglKirElpg0kSmlyozj+B8E7/uFiCX/LLKOK64lJiQSR9pOXLV74qzbx3p+VX9gxQWqSswYw7ffbmfKlIX88UcyAD161GPatH706mXvbVxNZEqpEgs6vJLQLbMI2fI27mqtrbIz/BYrr/555HYYh/OcfuCw56xdnR2XyzB58kK2bk2madM4pkxJZOjQFkgluFrWRKaU8plkHaXL/N44zMm+BU+XwNwRdcjuNpG85sMgOLIiQ1RlaOfOFKKjQ6hZM5LgYAePPdaf7duPc9NNHQkNDbI7vHyayJRSp8rLIOjPdQQd2wjOTEJ2zbGec7myC1TL6jEdd3wC7mjPb4SCI6yumJRfS07O5umnlzNz5jpGjWrHv/99HgAXXFA5P1tNZEopACRtF9FfXYzk/FlsP4Pu6AakXbNGbxMGmJwcJ6+8so5//3s5x49bx0B2thNjTKW4hVgUTWRKVWGSnUzEgr9bw5EcWXnKcmfNTjgyD5HX7C9gXDjrJbIptzkJLdvYEK0qL2634dNPtzBt2mJ277YG8OzfvyHTpvWjU6faNkdXPE1kSlUhkrEPR8YBgo6sInT9/whK23lKHWetbmQlPou7evvTN3vXQTUDzvr1Rxgz5jsA2rSpwdSpiQwZ0qRSX4V500SmVBUQvPs7or6/tsjlOW3G4Gx8Kc7aXbQLpypi37406te3OvHt2LE2f/tbJ9q3r8nIkW0JDvav8dA0kSkVaNx5OI7/QcynfTHBkYAgzowCVZy1uhKUkkRO65vI7XgHJryGPbGqCnf4cAaPP76Ut95az1df/V9+11JPPjnQ3sDOgiYypQJIyB/vEjn/5IhIhXvTSLt6Je64shsHSvmPjIw8ZsxYzQsvrCQ9PY+gIGH16kP5icyfaSJTyo9J5iFC/3iXkO2f4kjbheSlFViefe495La/HRDrqstPnnmosuNyuXn33Y089tgSDh60rswvuqgZU6cm0qpVdZujKxuayJTyN8YQvPdHouZeXWSV9Ct+tvooVFXe88+vZNq0xQB07lyH6dP7kZjYwOaoypYmMqX8QMjWjwjZ9Y3VTP7QklOWu2Mak931IdxxCbhqngviXw/rVdnKyMjL78B39OgOfP55Enfe2ZW//KVVuY8NZgdNZEpVRu48wldMI3TT66c01PCW0/7vZPecrolLAbBnTyrTpy9mxYoDLF06irCwYKpXj2DevJF+05S+NDSRKVWZGEPYymmEr3v2tIuzu07AhMaT1+gCTEyTio1NVVopKTk8++wK/ve/NeTkuAgJcbBixcH8W4iBnMRAE5lStpLsP5GcZEI3zyJk22wcmftPqZNxwQc46/WDkCgbIlSVWW6ui9de+42nnlrGsWNWP5jDhrVk0qS+NGlSdX4PqIlMqQrmSNlKzMfdiq2XduU83DXPrYCIlL+6+urPmTdvDwC9e9fnkUf60bVrXZujqniayJSqKM5MYt9qgBj3KYtcMU0wEXXIa3YluW1uhqBQGwJU/sDtNvkNNkaObMv+/elMmZLIJZc0C/hbiEXRRKZUOZLsPwnZ9gnhSx9EjKvAstymV5HV73kIjbUpOuVPtm1LZurURTRuHMf06f0AuPrq1vzlLy0JCak8Y4PZQROZUuXAcTyJmNndT7vMFd+K9GFL9cfJyid//pnFE08s4/XXf8PpdBMfH8Y//9mT6OhQHA7B4ajaSQw0kSlVpoL3/FDkD5Wzuz9MToc7Qf/wKB9kZTl56aU1PPvsClJTcxGB669vx4QJvYmO1lvP3jSRKXW2jJuQrR8SOe/2UxbltLuN7F7/0qsvVSJ//pnFgAHvsXev1eXY4MGNmTq1H+3a1bQ5sspJE5lSpeXKIe6NOqddlN3pPnK6TtAfKqtSqVEjgnbtalKtWjjTp/dj4MBGdodUqWkiU6oUJPMQse+1OqU8q/sUcjv+Q6/AVIls2HCUKVMWMmFCbzp3tk6OXn75QmJjwwKyS6mypolMqZJw5RKx+D5Ct8zKL3KH1yLt2t8hONzGwJQ/2r8/ncceW8J7723Mb1b/4YdXABAfr8eTrzSRKeUjx7ENxHzat0BZbsvryOo/w6aIlL9KS8vl+edXMmPGarKynAQHOxgz5lzuv7+H3aH5JU1kSp2GI2UroRteJnTrR0huymnrpF63FROhD99VySxcuJcbb5zDkSPWoKeXX96CKVP60rx5NZsj818VlshE5CLgeSAIeNUY83ih5Y2At4B4T50HjDFzKio+pQBwZhE19xqCDywoskr6xV/gqj+gAoNSgaRFi2pkZubRo0c9pk3rR69e59gdkt+rkEQmIkHADGAIsBdYISJfGmM2elWbCHxkjPmfiLQF5gBNKiI+pQDCVj9O+OoC51c46/Yht+V1OOsPwkTWswq1IYcqgVWrDvL667/x/PODCQ52ULduFD//PIKWLatV2S6lylpFXZH1ALYaY7YDiMgHwBWAdyIzwIm+euKAU7sBV6qcxB5bRvjvJ5NYXoPBZJ73GoRWnR7EVdnauTOFhx5aw/ffW3/KevY8hxtuaA9Aq1bV7Qwt4FRUIqsP7PGa3wv0LFRnCvC9iNwBRAGDKyY0VdU5UnfQ8vdx+fNpVy3AXaODjREpf5acnM3TTy9n5sx15Oa6CA8P4vbbO3PFFQl2hxawKlNjjxHAm8aYf4tIb+BtEWlvzGm6CgeSkpIqNjo/pfupaE22TCP+6HyCnScbc2w59yXSjoXDMd1vZ6LH1el9/vluXnhhE2lpTkTg0kvrc9ttrahbN4LDh3dz+LDdEVZOCQlnl+QrKpHtAxp6zTfwlHm7GbgIwBizRETCgZrAaT/6s33jVUFSUpLup9MxbuJeO/XWTsZ5b1K32ZVUvdGcSkaPq6LVqpVNWtrvDBjQkGnT+hEZmaL7qgJUVCJbASSISFOsBHYtMLJQnd3A+cCbItIGCAeOVFB8qgooakDLtCt/ZcuxcBKatbYhKuXPFi7cy44dKYwa1Q6wOvVt2jSO/v0bIiIkJZ3+pxuqbJU4kYlIbWNMiS6QjTFOERkHzMVqWv+6MWaDiEwDVhpjvgTuBWaKyN1YDT9GG2NMSeNTqrCgg0sIXzqB4KNrCpTnNRhC5oUfWa0Qk/VWmfLdli3HePjhhXz33XYiI4MZPLgx9epFExzsYMAA7RexovmUyEQkDngRuBpwA1EicjnQzRjzsC/r8PwmbE6hssle0xuBvoVfp1RpSdpOYj/sdEq585z+ZFz4MQSF2RCV8meHDmXw+ONLmTVrPS6XISoqhDvv7EpsrB5LdvL1iux/QDrQEvjNU7YM+DfgUyJTqlwZQ/Cub3BkHsSRspWwDS+dUiW35XVk95iGCa9hQ4DKnzmdbp55ZgXPP7+SjIw8goKEm27qwAMP9KJ27Si7w6vyfE1kg4EGxphcETEAxpjDInL6MSyUqgBBB5cSuuUtcLsI3fZRkfUy+71IXqtRFRiZCjRBQcK8ebvJyMjj4oubMWVKov4WrBLxNZGlAtWBgycKRKQhcKg8glKqOOFL/knYhpdPKTeOEHJb3YBk/0leqxtwNjjPhuiUvzPG8OOPO2nUKI5WraojIjzxxECOH88hMbGB3eGpQnxNZK8DH4vIBMAhIt2BfwGn/iVRqhxJ5mFi32tZoCyv0cU4z+lPXpPLMdH6R0adnXXrDjN58gLmzdvDBRc04aOPrgSgfftaNkemiuJrIvsXkAO8htUs/j2sJPZsOcWl1CmiZ/ci6PjmAmWp1/6OiW5YxCuU8t2ePak88sgSPvpoE8ZAXFwY/fo1zB8nTFVeviayGsaYf2M17sgnIjWBo2UelVLeXLnEfNwFR/re/KKc9mPJ7vmoduCrzlpKSg7PPruC//1vDTk5LkJDg7jllnO5774eVKumg1v6A18T2XZOdujr7Q+sZ2dKlbngvb8Q+fPoU8YDS7k5WROYKjPHj2fz3/+uITfXxbBhLZk0qS9Nmmhn0f7E10R2yl8NEYnG+k2ZUmUq4pcxhG6bfUq5O/Ic0kZs0CSmzsqJhhznn98Eh0No3DiOp54aSPv2tejaVTso80dnTGQisgOrl40IEdleaHFN4JPyCkxVTREL7jwlieU1uojM89/SHzCrs7Zs2X4mTVrA8uUHeOWVi7jmGqtbsr/+VUc78GfFXZGNwboa+xK4xavcAIeMMRvKKzBV9UR+exUh+37Jn08dvhYT08S+gFTA2LYtmSlTFvHVV1sBqFUrEofD5qBUmTljIjPG/AQgInWNMakVE5KqUtxOgg4tJfqbywoUp4zaCWHx9sSkAsbRo5k88cQy3njjd5xONxERwYwb15U77+xKTEyo3eGpMuLTMzJjTKqItAf6Yd1SFK9l08opNhXo8jKIe6v+KcUpNx0FR2UaKk/5q48/3sLMmetwOIRRo9oxYUJv6tWLtjssVcZ87TT4ZqxOg38ChgA/YA258lX5haYCmWQdIfbdk+M0meAonPUHkjnkXRujUv7O5XKTlJRM69ZWf5o33dSBDRuOcvvtnWnXrqbN0any4utp7wPAJcaYX0Uk2RhzuYhcBvylHGNTgSrneIEkltvsL2Sd97qNAalA8Msvu5g0aQG7d6eydu2NVK8eQVhYMP/5zxC7Q1PlzNfHnXWMMb96pt0i4gC+Aa4sl6hUYDKG8MXjiXu7SX5RbrNhmsTUWVm//gjDhn3GVVd9xvr1R4mNDWPHDh3Qsirx9Ypsr4g0NsbsApKAS7F69Mgrt8hUQIl5rzWOzIMFyrJ6P0Fuu1ttikj5u/3703n00cW8995GjIHY2FDuvrs7t93WmYgIfcZalfj6af8baA/sAh4BPgZCgHvKKS4VKIwh5sNzT0liaVevwh3X3KagVCD429++Y+HCvQQHO7jppo7cf38PataMtDssZQNfWy2+5jX9tYhUA8KMMXr9rorkOLqWmM8HFihLuekIOELsCUj5NafTTXp6LvHxVv+HDz7Yi5deWsuUKX1p3ryazdEpO5XqJ4HGmGwgWET+VcbxqEDhzD41id18TJOYKjFjDN98s43evd/m7rt/yi/v27cBb799mSYxVfwVmYj8FeiE9WzsFSAKmAjcBiwu1+iU3wlfOoHgPT8QlJKUX5bZ/7/ktRxpY1TKX61efZCJExewePE+AFwuQ2pqDrGx2l2ZOqm4vhafBEZhJawRQC+gN7AK6GeMWVvuEapKL+jQciuBHVl5yrK8xpdqElMltnNnCtOnL+KTT/4AoHr1cO6/vyc33dSR0NAgm6NTlU1xV2TXAv2NMUki0gbYAIwwxnxY/qGpSs24iZx7NSF7fzrt4rRhyzBh1TCRtSs4MOXvkpOz6dPnbTIznYSHBxOH8icAACAASURBVHH77Z25667uxMXpVZg6veISWbwxJgnAGLNJRDI1ianwJf8kbMPLp5TnNvsLOV0ewB3f0oaolD/LyXESGhqEiFCtWjjXXdeO1NRcJk7sTcOGpxsKUamTiktkIiINOdm3orPQPMaY3eUVnKpcJHUnsR91OqU87aoFuGvoMBiq5NxuwyefbGH69MU89lh/LrusBQBPPDEQh0PHnVO+KS6RRQE7KTiw5i6vaQPoDetAZ9yErXyE8HXPFChOvW4rJkL7r1Ols2DBHiZPXsiaNYcA+OCDTfmJTJOYKoniEpm2la7igg4tJ/qrCwqU5bQfS3bPR3WkZlUqW7YcY/LkBcyduwOAunWjmDChN9dd19bmyJS/Km48MldFBaIqF8lOJvadpqeUp1/2Ha66vWyISAWC77/fwYgRX+JyGaKiQvjHP7rx9793ISpKz5lV6WmHZOq0CiexzP4zyGt5nU3RKH9mjEE8V++JiQ2oVy+aCy5owgMP9KJ27Sibo1OBQBOZKsjtJO71k8+98s4ZSOZFn4BDH4WqknG53Lz77kZmzlzHN9/8H7GxYURGhrB8+Q1ERuoVmCo7peqiSgUmyTpSIIkBZF7yuSYxVSLGGL7/fgeJie9y550/8vvvR/jgg035yzWJqbLm8xWZiAQD3YH6xpjZIhIBYIzJKq/gVMXyHuwSIGXMcZsiUf5q7drDTJ68gPnz9wDQqFEsDz/cl6uu0t8WqvLjUyITkXbAF57ZusBs4HzgOqyuq5SfC186IX86r+kVZJ73pn3BKL/0+ONLefzxpQDEx4dx3309ueWWjoSF6RMMVb58vbX4P+ARY0wLTg6m+SvQz9cNichFIrJFRLaKyANF1LlGRDaKyAYRec/XdauzYAyhG14hbP1/84syz3tTm9arEuvWrS6hoUGMG9eFtWtvZNy4LprEVIXw9SjrALzlmTYAxph0EfFpFDsRCQJmAEOAvcAKEfnSGLPRq04C8CDQ1xiTLCLaSV95c7uIe71GgaKUGw9rElPFys118frrv7FnTxqPPtofgPPPb8y6dTdSr160zdGpqsbXRLYL6AysPlEgIt2AbT6+vgew1Riz3fPaD4ArgI1edW4BZhhjkgGMMYd9XLcqjdxU4mY1KlCUOmITBIXaFJDyB8YYfvzxAK+8spAdO1IQgdGj25OQUB0R0SSmbOFrIpsMfCMi/wVCRWQ88Hfgdh9fXx/Y4zW/F+hZqE5LABFZhNXt1RRjzHc+rl+VhDuvQBLLTbiWrAEv2RiQ8gdLl+5n0qT5rFhxEICEhGpMnZpIixY6sKWyl0+JzBjzpYgcwLpqWgS0AoYbY5aVcSwJwECgATBfRDoYY07bdC4pKel0xaqQwvspKnUDbdaMzp9PrjmQbefcC7o/9ZgqgstlmDBhNT//bCWw6tVDueWWllx5ZUOCg91s3brV5ggrNz2uipeQkFB8pTPwtdViNWPMCmBFKbezD2joNd/AU+ZtL7DMGJMH7BCRP7AS22m3ebZvvCpISko6uZ+c2cS9WbfAcleNjjiu/Bzdk4X2lTpF7do7iIg4yrhxXbn00ng6dWpjd0h+QY+riuFrq8V9IvKliAw/8fuxEloBJIhIUxEJxRqw88tCdT7HuhpDRGpi3WrcXoptqUKCd351ShLLuPBj0q+ab1NEqjLLynLyzDPLmTfv5AhNU6cmsmrVaB56qDdRUdoSUVUuvh6RTYHhwN3AKyLyJfAe8L0vHQsbY5wiMg6Yi/X863VjzAYRmQasNMZ86Vl2gYhsBFzAeGPMnyV/S8pbxPxxhP7xTv68O6waadclgUP/GKmC3G7DBx9s4tFHF7NvXzrt2tVkwYLrcDiEOnW0T0RVefn6jOwQ8ALwgog0A0YCTwM1gTo+rmMOMKdQ2WSvaQPc4/mnykBE+tYCSSzzvDfIa3aVjRGpyuqXX3YxadIC1q8/CkCHDrV45JF+Oi6Y8gulOS2P8/yLATLKNhxVViQ7mXarTna6kjpiEyaqno0Rqcpo79407rrrR3780Rovt0GDGCZO7MM117TWJKb8hq+NPVpidUU1EiuJfQxca4xZXI6xqVIK2j+P6DlX5M9nnPemJjF1WjExoaxZc5jY2FDuuac7t97amYgIve2s/IuvR+wK4DPgTuBHHXCz8nIc21ggieU1vBBnsyttjEhVJqmpOcycuY6xY7sQERFMXFwYs2ZdSuvWNahRozTtuJSyn6+JrI4xJrtcI1FnxZG8mYh5txN8dE1+2a6EB4gfcNpuLVUVk5fn4q231vP440s5ejQLEbjnnh4A9O3bwObolDo7RSYyERlhjHnfM3uNFNH/njFmVnkEpnznSN5MzCe9CpRlDniJI3Ql3qaYVOVgjGHOnO1MmbKQpKRkAHr0qEdioiYvFTjOdEU2GjiRyG4poo4BNJHZyHF0HTGfD8ifz2t6BVm9n8BE1tXeOqq4tWsP8+CD81iyxOp7oFmzeB5+uC9Dh7agqBNTpfxRkYnMGHOh17TPw7WoihGy/TMi5o9DnCcbjmZ3fYiczuNtjEpVJrt2pbBkyT6qVw/nn//sxY03diA0VEf7VoHHp549ROS03USJyNKyDUf5wnF0HZE/31ggiWV1n6pJrIpLTs7myy9P9ns4dGgLnnpqEGvW3Mitt3bSJKYClq+NPVoXUa7jl9vA+1ZiZv//ktd0KITo8BlVVXa2k5kz1/H008vJyMhj6dJRtGhRDRHhllvOtTs8pcrdGROZiLzumQz1mj6hCbCpPIJSBUnGfsJXPVaglw6AzAEvk5cw3KaolN3cbsMnn2xh2rRF7NmTBsDAgY2wOslRquoo7opsXxHTBlgFfFjmEamCctOIfb/tKcWu+FaaxKqwBQv2MGnSAtautcafbdu2BtOm9eP88xtrQw5V5ZwxkRljJoH1LMwY803FhKS8xc06OfpNXsMLcNY/j9xWoyBEO3GtymbOXMfatYepVy+KCRP6MHJkG4KCfB3MQqnAcqbfkfU1xizyzKaJSP/T1TPG6Fgg5cSRcnIUG2e9RDIv/MjGaJSdDh3KICUlh5YtqwMwZUoiHTrUYuzYLkRFhdgcnVL2OtMV2WucbOTxbhF1DNCoTCNSADiO/0HM7B758xmXfGVjNMouGRl5vPjiKl58cRVt29bg+++HIyI0axbP+PE97Q5PqUrhTL8ja+013bCoeqoc5KYWSGJZvZ8Efe5Rpbhcbt59dyOPPbaEgwetn1nUrBlJWlousbFhNkenVOVSqm6uRaQf4NLe78tH7NvN8qfTL/4cV/2B9gWjKpQxhh9+2MnDDy9k0yZrXNkuXeowbVo/7VZKqSL4+oPoX0Uk0TN9H/Ap8ImI/LM8g6uKQtc9hxgnAK5qbTSJVTEpKTmMGfMtmzb9SaNGsbz22sX8+OO1msSUOgNfr8g6ACd68bgVGAikAQuAJ8o+rKopbNW/CF9zcnemXz7XxmhURdmzJ5U6daIIDQ0iPj6cSZP6kpPj4pZbOhIWpmODKVUcX78lDsAtIs2AYGPMBgARqV5ukVUlbicR88cSuvVkq8TU4esgNNbGoFR5O348m2efXcFLL61l6tREbrutM4D2xqFUCfmayBYDzwHnYA2wiSep/VlOcVUZQUfWEP3FoAJlaVevxMQ0tikiVd5yc1289tpvPPXUMo4ds4b527btuM1RKeW/fE1ko4HxwBbgcU9ZW+DFcoipynD8+fupSWzYMtxxLWyKSJUnYwxffJHE1KmL2LEjBYC+feszfXo/unSpa3N0SvkvnxKZMeYIcH+hsq+Br8sjqKoias4V+dPZne4jp9tEG6NR5e3bb7czevQcAFq2rMaUKYlcfHEz7VJKqbPkUyITkWDgQWAUUB+r38W3gceNMXnlF17gClsxHUfOMQCyekwnt+MdNkekysPx49nEx4cDcNFFzRg8uDGXXNKcG25oT3CwdimlVFnw9dbiE0Bf4C5gF9AYmAjEA/eWT2iBK2zVY4Sv+3f+fG6HcTZGo8rD0aOZPPHEMt5/fyOLF4+iUaNYHA5h9uyr7A5NqYDjayK7BuhsjDnqmd/gGWxzLZrISsadR/iaJ/NnU0f+ob12BJDMzDz+9781PPfcStLScnE4hHnz9jBqVDu7Q1MqYPmayIIAd6EyNz7+oFqdFPvGyYf6aVf+iomsbWM0qqy4XG4+/HAzjz66mH370gEYMqQJU6Yk0q5dTZujUyqw+ZrIZgNfisjDwG6sW4uTPeXKR0EHlyLGBYARB+6anWyOSJWVBx6Yx8yZ6wDo0KEWjzzSjwEDtD9tpSqCr4lsPPAwVo/452A19vgAmFpOcQWk6K8vyp9OvfGQjZGosuB0uvMbbIwe3YG5c3cwYUJvrrmmNQ6H3i5WqqL42vw+B5jg+adKIWjfr/nTmf1ngEPHkPJX+/en8+iji9m/P51PP70KEaFdu5qsWTNaB7dUygZnTGQikoB1FdYeWA3cZIzZXRGBBZrob6/Mn85reZ2NkajSSk3N4YUXVjFjxmqyspwEBzv4449kWrWyemrTJKaUPYr75v0H6zbiaOAoVjdVqoQiFvwjfzqr7zM2RqJKIy/PxauvrqNLlzd5+unlZGU5ueKKBJYvvyE/iSml7FPcrcWuQENjTJaI/AJsroCYAosxhG55K382t81NNgajSsrtNgwe/CHr1h0GoEePekyf3o+ePc+xOTKl1AnFJbJQY0wWgDEmTUQiKiCmgBLilcRSh/9mYySqNBwOYciQJqSl5fLww30ZOrSFdimlVCVTXCILE5HJXvMRheYxxkzzZUMichHwPNZv0l41xjxeRL1hWM36uxtjVvqy7srKkbyFyIV3AWCCwjAx2hy7stu5M4Vp0xYxcGAjbrihPQD33tuD++/vSWhokM3RKaVOp7hE9hGQ4DU/u9C88WUjIhIEzACGAHuBFSLypTFmY6F6McA/gGW+rLeyi/mkZ/505uB3bYxEFSclJZcJE6zfguXluVm9+hDXXdeWoCAHERE6uKVSldkZv6HGmFFltJ0ewFZjzHYAEfkAuALYWKjedKx+HceX0XbtYQwx77XOn83uNhlnw8E2BqSKkp3tZObMdTz55BLS0pyIwLXXtmHixD7aClEpP1FRp5r1gT1e83uBnt4VRKQLVsOSb0Sk2ESWlJRUthGWkdDs/XRcdkWBsvVRl4NN8VbW/VQZ7N6dwbhxyzhwIAuAHj1qcuedrWnVKo6srIMkJR20OcLKS48r3+m+Kl5CQkLxlc6gUtwzEREH8AxWM3+fnO0bLw8xH3TAkb6nQFnKX/eREBJlSzxJSUmVcj9VFk2auIiOXkfbtpHcemszbrihjzbk8IEeV77TfVUxKureyT6godd8A0/ZCTFYP7r+VUR2Ar2w+nbsVkHxnR3jJmzVYwWSWG7za0gZcxxsSmLqVJs3/8no0d9w+HAGACEhQXz66VUsWHAdffrU1iSmlJ+qqCuyFUCCiDTFSmDXAiNPLDTGpAD5XYSLyK/Aff7SajFqzlCCDyzMn08Zc9zGaFRhBw9m8PjjS5g1awNut6FWrUieemoQAA0bxtocnVLqbPmcyERkEFYCqmOMudLzTCvGGDOvuNcaY5wiMg6Yi9X8/nVjzAYRmQasNMZ8Wcr47ZdzvEASS712vY3BKG/p6bn85z+refHFVWRk5BEUJNx0UwfGj+9hd2hKqTLkUyITkbHAfcDrWMkMIBd4FEj0ZR3GmDnAnEJlk4uoO9CXdVYGMbNPtllJGX0QgsNtjEadMHfuDu688wcOHcoE4OKLmzF1aiItW2qXUkoFGl+vyO4FBhtjtovIiRGhNwFtyics/yBpu3FkWcOxuMPiNYlVIjVrRnDoUCZdutRh+vR+9O3bwO6QlFLlxNdEFgPs8kyf+BF0MNZVWZUV+2HH/OmMoT/bGIlau/Yw3323nQce6AVA1651+e67a+jRo56ODaZUgPM1kS3EurX4hFfZ34Fin48FqqD98/Onc9qMwR3XzMZoqq7du1N55JHFfPSR1Z9137716dfPaiDbq5d27KtUVeBrIrsD+FpEbgFiRGQD1tXYJeUWWSUW804LHNlH8+ez+z5tYzRV0/Hj2TzzzApefnktOTkuQkOD+NvfzqVDh1p2h6aUqmC+jhC9z9NKsQ/QCKuXjiXGGFd5BlcZxXx4boEkljHkPRujqZpee20djzyyhOTkbAD+7/9aMXFiH5o0ibM5MqWUHXxufm+MMcAiz78qKWLebTjSduXP6+/F7LFt23GSk7Pp27c+06f3o0uXunaHpJSyka/N73dQRE/3xpiq8XDImUlo0gf5syk3HrYxmKpl6dL9ZGXlMWhQYwDGj+9Jv34Nueiiptobh1LK5yuyMYXm62E9N3u/bMOpvOLePNlwIHXEBggKtTGaqmHr1mSmTFnI119vo1GjWFasuIGwsGCqVQvn4ourxvmTUqp4vj4j+6lwmYj8hPUD5+fKOqjKxJG6g5iPOufPu6q3w0TVtzGiwHf0aCZPPLGMN974HafTTWRkMMOHt8Hl8mn4O6VUFXM2fS1mAQF9Why0bx7R3xYckiX9L1X2EWG5y852MmPGap57biVpabk4HMKoUe2YMKE39epF2x2eUqqS8vUZWeGupCKBS4HvyzyiSiLowMICSSyrx3RyO95hY0SBTwTeems9aWm5DBnShKlTE2nbtmbxL1RKVWm+XpEVHlAnA5gBvFmm0VQi0d9clj+dPvQHXLW72xhN4Prll1106lSHatXCCQsL5plnziMkxMGAAY3sDk0p5SeKTWQiEgT8AHxkjMku/5Aqgdy0/MnsTvdpEisH69cf4eGHF/LTT7sYN64LjzzSH4DBg5vYG5hSyu8Um8iMMS4RedEYM6siArKdcRM36+QYoDnn3m1jMIFn//50Hn10Me+9txFjIDY2lHPO0edfSqnS8/XW4jcicolnKJaAFvnDdfnTuS2u0RGey0hqag4vvLCKGTNWk5XlJDjYwZgxHRk/vic1akTYHZ5Syo/5msgcwKcishCre6r8dtDGmJvKIzBbuF2E7P4WABMSS9bAV2wOKHD89tsRnn56OQBXXJHAww/3pVmzeJujUkoFAl8TWRLwVHkGUhlEfX1x/nTq9Uk2RuL/jDGsWXMov/uoxMQG3HdfDy64oAk9emiv9EqpsnPGRCYiI4wx7xtjJlVUQHYJ3vM9wYeXnywICrMvGD+3cuUBJk1awJIl+/n552vzk9nEiX1sjkwpFYgcxSx/uUKisJvbSdTca/JntR/F0tm5M4Ubb/yGwYM/ZMmS/VSvHs7+/el2h6WUCnDF3VqsEj2yhi+dkD+ddtV87UexhI4dy+Lpp5czc+Y68vLchIcHcfvtnbnrru7ExemVrVKqfBWXyIJEZBBnSGjGmJ/LNqSKFbzjC8I2Wo06THAk7hodbY7I/zz++DJeeWUtInDttW2YOLEPDRrE2B2WUqqKKC6RhQGvUXQiM/hzf4tuJ1E//TV/Nu3qlTYG4z/cbsPBgxn5v/+6997u7NmTyoMP9qJjx9o2R6eUqmqKS2QZgTzeWNRXF+ZPp182BxOlremKs2DBHiZNWkBmZh6LF48iONhBnTpRvP/+ULtDU0pVUcU19ghcbifBR1blz7rqaou6M9m8+U+GD/+Cyy//hLVrD5OWlsv27TpCtlLKflW2sUfoptfyp1NHbLAxksrt0KEM/vWvJcyatQG32xAdHcI//tGNsWO7EBUVYnd4Sil15kRmjAnMJ/a5aUQs+Wf+rA6UeXput+GSSz5m27bjBAUJN93UgQce6EXt2tptl1Kq8jibgTX9VsSie/KnMwa/bWMklY/T6cbpdBMeHozDIdx5Z1e++24HU6cm0rJldbvDU0qpU1S5Z2SSvofQbR8D4I6si7PJ5TZHVDkYY5g7dweJie/w73+vyC+/4Yb2vP/+UE1iSqlKq8olsujPz8ufTr98ro2RVB5r1x5m6NBPGD78CzZvPsY332zF5XIDIBKwj0mVUgGiSt1adPy5Hkf2EQDyGl+GiWlsc0T22r07lUceWcxHH20GID4+jPHjezJmTEeCgqrcOY5Syk9VqUQW81li/nTmoFdtjMR+W7cm07fvO+TkuAgNDeLWWztx773diY8Ptzs0pZQqkSqTyIL2zcufzhz0KgRXvT/YbrfB4bBuFTZvHk+vXudQq1YkEyf2oUmTOJujU0qp0qmw+0cicpGIbBGRrSLywGmW3yMiG0XkNxH5SUTK9L5f9LdX5E/nNf+/slx1pWeM4bPP/qBHj1ls3HgUsJ59ffzxlbz66sWaxJRSfq1CEpmIBAEzgIuBtsAIEWlbqNoaoJsxpiMwG3iyzLafujN/Ov2SL8tqtX5hyZJ9DBnyITfeOIetW5OZOXNd/rLQ0CAbI1NKqbJRUbcWewBbjTHbAUTkA+AKYOOJCsaYX7zqLwWuL6uNx3w+IH/adU7/slptpbZ1azLjx6/k118PAVC7diQPPtiLUaPa2xyZUkqVrYpKZPWBPV7ze4GeZ6h/M/BtWW1cclMAyG16VVmtslL74INNjBv3A06nm8jIYMaN68odd3QlJkbHWVNKBZ5K19hDRK4HugEDzlQvKSnJp/XFH53HiSdAvze4H+Pj6/zZOefkEhwsXHppQ269tSW1aoVz8OAuDh60O7LKzddjSum+KgndV8VLSEg4q9dXVCLbBzT0mm/gKStARAYDDwEDjDE5Z1qhL2/ckbyJmHn3AWAkmBat2pQgZP/gcrn58MPNfPnlVt5773IcDiEhATZsaMmxY3vP+gCpKpKSknRf+Uj3le90X1WMimq1uAJIEJGmIhIKXAsUaHUhIp2Bl4GhxpjDZ7vBsFWPEfNJ7/z5zCHvnu0qK51fftnFgAHvMXbs93z33Xa++WZb/rIaNSJsjEwppSpOhVyRGWOcIjIOmAsEAa8bYzaIyDRgpTHmS+ApIBr42NMt0m5jTOlGa3RmEb7mZKPH7HPvxdnowjO8wL+sX3+Ehx9eyE8/7QKgQYMYJk3qw6WXNrc5MqWUqngV9ozMGDMHmFOobLLX9OCy2lbUnCvzp1Ov34YJr1FWq7bdxInzmTFjNcZAbGwo99zTnVtv7UxERKV73KmUUhUiIP/6BR9eBli92wdSEgOoXz+GoCAHN9/ckfvv76m3EJVSVV7gJbKc4/mT6UN/tDGQs5eX5+Ktt9bjcAg33dQRgJtv7siFFzalWbN4m6NTSqnKIeASWdT3I/KnTXQDGyMpPWMM33yzjSlTFrF1azKxsaFcdVVLqlULJzQ0SJOYUkp5CbhEFnxoCQAmJNrmSEpn5coDTJq0gCVL9gPQrFk8Dz/cl/j4MJsjU0qpyimgEplkJ+dPZ1z0qY2RlFx6ei533PEDn31m/XiyRo0I/vnPntx4YwdCQrRPRKWUKkpAJbLQ31/Mn3bV6WFjJCUXFRXCnj1phIcHcfvtnbnrru7ExelVmFJKFSegEln4umfsDsFn2dlOXnllLZdd1oJmzeIREV58cQgxMaE0aBBjd3hKKeU3AieRuU72aJVxwQc2BnJmbrdh9uwtTJ++iD170li9+hBvvnkpAG3aBNZPBZRSqiIETCILW/NU/rSzYeXsxWP+/D1MnryAtWutHrjatq3JqFHtbI5KKaX8W8AksvC1TwPgjm4EVhdXlcaOHcd54IF5zJ27A4B69aJ46KE+jBjRhqCgChukWymlAlJAJDJH8qb86czzXrcxktNzOt38+ONOoqNDuOuu7owd25nIyBC7w1JKqYAQEIks7LcX8qddtbvZGIklPT2X2bO38Ne/tkdESEiozquvXkxiYgNq1Yq0OzyllAooAZHIJNMaMTKv/iBb43A63bzzzgb+9a8lHDqUSfXqEQwd2gKAq65qaWtsSikVqAIikYXs+wWAvOZX27J9Ywxz5+5gypSFbN58DIAuXepQr16ULfEo5StjDOnp6bjdbp9fEx4eTkpKSjlGFTh0X53K4XAQHR2NlGFbBr9PZJK2O3/aWbdPhW9/7dpDTJy4gIUL9wLQuHEskyf35aqrWuJwVK5GJ0oVlp6eTlhYGKGhoT6/JiwsjPDw8HKMKnDovjpVbm4u6enpxMSU3e9l/T6RnWitCGBim1T49n/8cRcLF+4lPj6M++7ryS23dCQszO93q6oi3G53iZKYUmcrNDSUrKysMl2n3//FDd0yC4C8RhdVyPaOH89m8+Zj9Op1DgBjx3YmN9fF2LGdiY/XMy+llKpo/p3I8tLzJ7O7TSrXTeXmunj11XU89dRyHA5h9erRxMWFERkZwoQJvct120oppYrm17/GDd36cf60u3r59JBhjOGzz/6gR49ZTJgwn+TkbFq3rs7x49nlsj2lqprq1auTmJhI7969GT58OMePnxwcd9OmTVx++eV069aNLl268OSTT2KMyV/+ww8/MHDgQHr27Em/fv146KGH7HgLZ7Ru3TrGjRtndxhn9Mwzz9C5c2e6devGTz/9dNo6F198MYmJiSQmJtK6dWtGjhwJQEpKCsOHD6dv37706tWLd955B4CjR48ybNiwConfrxNZxKK7y3X9S5bsY8iQD7nxxjns3JlCq1bV+eCDoXz99f/RuHFcuW5bqaoiIiKChQsXsmTJEqpVq8arr74KQFZWFiNGjODuu+9m5cqVLFy4kOXLl+cv37hxI+PHj+eVV15h2bJl/PrrrzRr1qxMY3M6nWe9jmeeeYZbb721QrdZEps3b+aTTz5h6dKlzJ49m3vvvReXy3VKvW+//ZaFCxeycOFCunfvzuWXXw7Aq6++SuvWrVm0aBFff/01EydOJDc3l5o1a1KnTh2WLl1a7u/BfxOZ++SOzuz3whkqlo4xhvHjf2HlyoPUrh3Jc8+dz6JF13PRRc3KtNmoUuqkHj16cODAAQA+/vhjevbsyXnnnQdAZGQkTz31FM899xwAzz//PPfeey8tW1q/0QwKCuLmm28+ZZ3p6emMmL7qlQAAEdhJREFUHTuWPn360KdPH7744gsA6tevn1/niy++4Pbbbwfg9ttv5+677+b8889n8uTJdOjQocBVYpcuXTh8+DBHjx5l1KhRDBo0iEGDBp32D3Z6ejobNmygQ4cOAKxatYohQ4bQr18/LrjgApKSrPEH3333Xa699louv/xyhg4dCsALL7zAoEGD6NOnD4899lj+OkeOHMmAAQPo1asXb775Zin2ckFz5sxh2LBhhIWF0aRJE5o1a8aqVauKrJ+amsr8+fO59FKrs3MRIT09Pf+nHNWqVSM42Hpqdemll/Lxxx8Xua6y4rfPyIL+XJc/ndfqhjJZ55EjmRhjqF07ChHh0Uf7s3jxPu64oyvR0dqySwW+uFfji69TgvWljDlefCUPl8vFvHnzGDVqFGBdKXTq1KlAnaZNm5Kenk5qaiqbNm3y6ZbdU089RWxsLIsXLwYokJSKsn//fr7//nuCgoJwuVx8/fXXXH/99axcuZKGDRtSu3ZtxowZw9ixY+nduzd79uxh2LBhLF++vMB61q5dS5s2bfLnExIS+PbbbwkODubXX39l2rRpvP322wD89ttvLFq0iGrVqvHzzz+zbds2fv75Z4wxjBgxgkWLFtG3b19mzJhBtWrVyMrK4rzzzmPo0KFUr169wHYffPBBFixYcMr7GjZsGHffXfBO1oEDB/j/9u48OqoyzeP49weiEAPBY3CERmSkUURQaTBIENns2CrKYmj3bVBbRgdXxm5nxgnaiKDDHB0XlGN0RoSWNqdFoR0X6AAiaONBGXeSEGyIihEhBAhheeaPe1MUIalUAJOq5Pmck3Oq7n3r3qdeinrqfe9737dfv30zInXq1CnyY6ImCxYsYPDgwbRr1w6Am266iSuuuIIePXpQXl5Obm4uLVoEbaQ+ffowefLkOuv7UCVtImtVmAeAHXHoNx1v376Lp55axWOPrWTEiG48/XQwe/7gwV0YPLjLIR/fOVe7HTt2cM455/DNN99w8sknM3To4Z2hJz8/n9zcfXOwtm9fd7IeOXIkLVsGK7OPGTOGadOmcfXVV5OXl8eYMWMix/3iiy8ir9m6dSvl5eWkpqZGtm3cuJH09PTI87KyMsaPH09RURGS2LVrV2TfkCFDOOaYYwBYtGgRixYtYtCgQQBs27aNwsJCBg4cyIwZM5g/fz4AGzZsoLCw8IBENmXKlPgq5yDk5eVFfmxUxdq7d29ef/111q5dy6hRoxgwYADt2rWjQ4cOMZPi4ZK0ieyoT54EYNeJFxz0Mfbs2cucOZ/z0EPLKSkJRkBu2lTB7t17OeKI5O11de5gxdOCqqioOKw3+VZdI9u+fTuXXnopM2fO5JZbbolcd4lWXFxMamoq7dq1o0ePHnz00UeRbrv6ir5EUFGx/+Cto4/e9wM5IyODoqIiSktLWbBgARMnTgSCe/DeeeedmHXRunXr/Y49efJkBg0axEsvvcS6desYMWJEjec0M+666y5uuOGG/Y63dOlSFi9ezNtvv01KSgoXXXTRAbFD/VpkHTt2ZMOGDZHnJSUldOzYscb388MPP/Dhhx9GBnRA0C16xx13IImTTjqJE088kTVr1tC3b18qKipo06ZNbdVz2CT9t/XuE7IO6nULFxZz7rmzue22tykpKef00zswb96lvPzySE9izjWClJQUHn74YZ544gl2797N2LFjWbFiBfn5+UDQcrv33nuZMGECABMmTGD69OkUFBQAQWKJbnlVGTp0KDNnzow8r+pa7NChA19++SV79+6NtHBqIokRI0Zw3333ccopp0RaP8OGDePZZ5+NlFu9evUBr+3evTtr166NPC8rK4skidmzZ9d6zuHDhzNr1izKy4Mf2CUlJXz//feUlZWRlpZGSkoKX331FStXrqzx9VOmTIkMzIj+q57EIBiNmJeXx86dOykuLqawsJC+ffvWeNx58+Zx/vnn75e8O3fuzOLFi4GgBVpQUEDXrl0BKCws3K9r9aeS9N/YBzO/YlHRZrKzX+XTT0vp3LktzzxzPvn5VzJ48Ak/QYTOuXidccYZnHbaabzyyiu0adOG2bNn88gjj9CvXz8yMzPp06cPN998MwC9evViypQpjBs3joyMDAYMGEBxcfEBx7znnnvYvHkzAwYMYODAgSxZsgSAnJwcLrvsMrKysjj++ONjxjVmzBjmzp3L6NGjI9umTp3KqlWryMzMpH///jz//PMHvK579+6UlZWxdetWAG6//XYeeOABBg0aVOPIwCrDhg0jOzubrKwsMjMzue666ygvL+e8885jz549ZGRkkJOTs9+1rYN16qmnMnr0aPr37092djaPPvpopFt17Nix+3UN5uXlkZ2dvd/rJ06cyAcffEBmZiYjR44kJyeHY48NVrtfunQpWVkH19ioD0Xfk5HotmzZEgm26qJ0vBeTS0u3k56+bwmVe+/Np1OnVH7zmzNp3Tppe1hjWrNmDd27d2/sMJJCc62rLVu2kJZWv1tJDnfXYlNWUVHBc889R9u2bbn22sMzKC2ZXHDBBcyZM+eA65KxPndpaWn1Hhae1C2yHWc/VGeZsrKdPPjgMnr3zmXhwuLI9qlTh3D77f2abBJzziWGcePGNcv5LEtLS7n11lvjGlxzqJL6W7yy58217tu1aw8vvPAJU6euoLQ0mKBy2bINDB/etYGic865YMDH5Zdf3thhNLj09PT9BrP8lJI6kdHiwPDNjPnzC5k0aRkFBT8C0L9/Rx58cBAZGZ0aOkLnnHM/saRNZJXdfl3j9tzc1dx9d7DQZrdu7cnJOYcRI7r5bBzO1aBFixZUVlY2y64v1zgqKysjN0wfLkmbyHacMz3yeOfO3ZE1wLKzezBz5seMG3cG11/fi1atWjZWiM4lvNTUVMrLy+u1PlRZWVlkVgcXm9fVgapWiD6ckjaR0SqVTZt2MG3a+7zxRhHLl19DSkor0tKO4r33rvHVmZ2Lg6R6r9S7ceNGTjjBb1WJh9dVw2iwUYuSfiXpS0kFkn5bw/6jJL0c7n9fUtdYx3v88ZWceebzzJjxEV9/XUZ+/teRfZ7EnHOu+WiQRCapJfAkcAHQE7hCUs9qxcYBP5rZz4H/BKbGOub9979LWVklQ4d2YfHiK7nwwm4/RejOOecSXIPcEC1pAJBjZueHz38HYGZTosq8GZZZLukI4Fugg0UFGH1DtHPOuaYnkW+I/hnwt6jn68NtNZYxs93AFuDYBonOOedc0krqmT2cc865hhq1uAGIHrrTOdxWU5n1YddiGvBDdIGDaXI655xr2hqqRfZXoLukv5d0JHA58Fq1Mq8B14WPs4FFlkwzGjvnnGsUDZLIwmtetwFvAp8Dc83sU0kPSLokLPYccKykAmAS0O9wDdVvyuK4reEuSZ9JWi1poaQTGyPORFFXfUWVu1SSSTr0dTKSVDx1JenX4efrU0m1L7DVxMXx/7CLpL9IWhX+X7ywMeJMBJJyJW2U9Ekt+yXp8bAuV0v6RZ0HNbOE+gNaAoXAScCRwMdAz2pl/hGYET6+HHi5seNO4LoaCqSEj8c317qKt77Ccm2BJcAKoF9jx52odQV0B1YBx4TPj2vsuBO4rp4FxoePewLFjR13I9bXucAvgE9q2X8h8AYg4Gzg/bqOmYiDPTKAAjMrMrNK4A/AyGplRgL/HT5+BRiu5jmZYp11ZWZ/MbPt4dMVBNcnm6t4PlsADxLcx3jgGvLNRzx1dRPwpJn9CGBmGxs4xkQRT10ZUDVXVRpQ0oDxJRQzWwJsilFkJPA/FlgBtJfUMdYxEzGR+VD9+MVTV9HGEfzSaa7qrK+wG+MEM1vQkIEloHg+WycDJ0taJmmFpF81WHSJJZ66ygGulrQe+DPwTw0TWlKq7/daEs+16OpF0tVAP2BwY8eSqCS1AKYD1zdyKMniCILuxSEELf0lknqbWXzLtjcvVwAvmNl/hBNEvCipl5ntbezAmoJEbJHVZ6g+tQ3VbybiqSsknQf8C3CJme1soNgSUV311RboBeRLKibon3+tmQ74iOeztR54zcx2mdla4CuCxNbcxFNX44C5AGa2HGgNpDdIdMknru+1aImYyHyofvzqrCtJfYBnCJJYc72GUSVmfZnZFjNLN7OuZtaV4JriJWa2snHCbVTx/D98laA1hqR0gq7GooYMMkHEU1dfA8MBJJ1KkMi+b9Aok8drwLXh6MWzgS1m9k2sFyRc16KZ7ZZUNVS/JZBr4VB9YKWZvUYwVP/FcKj+JoIPTrMTZ109AqQCfwzHw3xtZpfUetAmLM76csRdV28CWZI+A/YAE82s2fWMxFlXdwMzJd1JMPDj+mb64xtJcwh+AKWH1wz/HWgFYGYzCK4hXggUANuBG+o8ZjOtS+ecc01EInYtOuecc3HzROaccy6peSJzzjmX1DyROeecS2qeyJxzziU1T2SuWZI0S1JOY8dRl3BG9UEx9r8l6aqGjMm5ROOJzCU1ScWSdkgqj/rr1EixzJJUGcawKUwyJx/KMc3sFDNbGh7/95JeqLY/y8xeOpRzVCfpiHAJm23he1kv6ZFwCq94Xn9eODOKcw3CE5lrCi42s9Sov8acWfwhM0slmGJnE5DbiLEcqtPC9zIMuIZ9s+k4l1A8kbkmSVILSa9I+lbSZkn54dRANZU9TtKfw3KbJC2J2tdZ0p8kfS9praRb4zm/mW0D5hDM3Yik1uFigd9I2iBpejidUV3nXy9piKQRwD8DV4WtpA/D/e9Kul5SG0llknpEvfb4sLV6bPj8Ekkfh+d5V1KvON/LV8B7wJlRx75R0ueStkoqlHRjuD0NeB3oEtVCPi7897gvLFsq6Q+Sjonn/M7VxROZa8rmE0xiezzwCfBiLeUmEswR2CEs+68QmQ1/PsFcej8DfglMlDS8rhNLagtcSbDwJMD9BKsPnA70AQYCv4t1/mhmNh+YBrwUtjr7Vtu/g2DuwyuiNl8GLDSzHySdBcwEbiRY8igXmFeVTOt4L6eG8RZEbf4OuIhgja2bgP+SdLqZbQEuJpgKraqFvBG4Myx/LsEksOXA43Wd27l4eCJzTcGrYStjs6RXAcxsr5m9YGZbzayCYD2ovpKOruH1u4BOQBczqwwX/gMYALQzs4fC7QUE83zGmtvzt5I2E8wEfxTwD+H2q4AcM/s+/GJ/gKC7Ltb562s2+yeyK8NtADcDT5nZX81sj5lVdXmeFeN4qyVtAz4D3iaYfBoAM3s9XEjSzGwRsBCodVAKcAtwn5ltCP89JgFj473u5lws/iFyTcEoM2sf/o0CkNRS0jRJRZLK2NeaqGnpjIeBdcDCsOtrYrj9RIIusqokuZmge+/4GLE8HMbR0cxGhcubQJCo1kWVW8e+xQJrO399vUOwmm5fSd2AnsC8qPdyb7X30pHYCxaeTrC0zZUEST3yI0DSCEnvh12hm4EsYi9L0gV4Perc/xduP67+b9O5/Xkic03VtQQzaA8jWK/u5+F2VS9oZmVmdme4dMsogi/8wQSr1K6JSpLtzaytmV18EPGUECSTKl0I11iKcf4DQo11gnC19D8StMquJFgrbFu4+2/ApGrvJcXM5tZxzL1mNgdYSbCmHZLaAK8AU4C/M7P2wFvsq9ua4lwP/LLa+Vub2bexzu9cPDyRuaaqLbCTYMHVFGBybQUlXSypmyQBWwiWJNkLLAcqJd0dDtZoKam3pL61HSuGOcD9ktIldQD+DZhVx/mr+w7oGparzWyCa2PR3YoQXB+7VdJZCqSG562pq7UmDwO3hLEfBRxJsJ7WnnAgSvR1w+8IluhoG7VtBvCQpC7hez5OUrNcTsgdfp7IXFP1PEErqAT4lGDUXW1OARYRDEBYBjxmZkvDFs6FQAZQDJQSXCdqdxDxTAI+Jhh0shp4n6BFU+v5azjGywQJZJOkD2o5z3vAboKBI29VbTSzFcB44GngR4JreFfHG7yZrSJI7PeY2WaCwRt/IrjFIJtgUExV2U+APKA47Eo8DpgO/C9B9+nWMM5Y1+eci5uvR+accy6peYvMOedcUvNE5pxzLql5InPOOZfUPJE555xLap7InHPOJTVPZM4555KaJzLnnHNJzROZc865pOaJzDnnXFL7f/7q5GqiDA1GAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotROC(y, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:23:54.420533Z",
     "start_time": "2019-11-22T17:23:54.052456Z"
    }
   },
   "outputs": [],
   "source": [
    "# pridict[线上，0.774493]\n",
    "result = pd.DataFrame()\n",
    "result['id'] = ids\n",
    "result['target'] = clf.predict_proba(testX)[:,1]\n",
    "result.to_csv('../submissions/xgb.csv', index=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Easy Ensemble Classifier[0.76]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 简单尝试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:26:02.038301Z",
     "start_time": "2019-11-22T17:23:54.422835Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/shensir/anaconda3/lib/python3.6/site-packages/sklearn/ensemble/bagging.py:623: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n",
      "[Parallel(n_jobs=4)]: Done   2 out of   4 | elapsed:  2.1min remaining:  2.1min\n",
      "[Parallel(n_jobs=4)]: Done   4 out of   4 | elapsed:  2.1min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "EasyEnsembleClassifier(base_estimator=None, n_estimators=300, n_jobs=-1,\n",
       "                       random_state=0, replacement=False,\n",
       "                       sampling_strategy='auto', verbose=1, warm_start=False)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eec = EasyEnsembleClassifier(random_state=0,\n",
    "                            n_estimators=300,\n",
    "                            n_jobs=-1,\n",
    "                            verbose=1)\n",
    "eec.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:33:51.317391Z",
     "start_time": "2019-11-22T17:26:02.041942Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done   2 out of   4 | elapsed:  7.7min remaining:  7.7min\n",
      "[Parallel(n_jobs=4)]: Done   4 out of   4 | elapsed:  7.8min finished\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbIAAAEXCAYAAADIosFBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd5gUVdbA4d/pnhzJOeMgWQkSBwEFBAPquoqguIhg+tDVVXcVyRhQXDPrKoo5g64oKGYykkGSDklykmFy6u77/VHN0DMwMw0z0zXhvM/DQ9Wt21Wnq7vnVLh1rxhjUEoppcorh90BKKWUUsWhiUwppVS5polMKaVUuaaJTCmlVLmmiUwppVS5polMKaVUuaaJrIIQkSYiYkQk3u5YyhsR6ePddw3KQCyTRGS73XEEkoi8JSLfF3MdZeYztFNJ7MvySBNZMXi/NMb7zy0i+0TkHRGpb0M4e4G6wC82bLvcEBGXiIzIV7wMa98dCHxE5YuINPB+3/uU4Gr/Dlx/FjHoZ6jy0ERWfIuxfkCNgGFAB+DTQAdhjHEbYw4ZY3JKczsiElKa6z8XIhJcnNcbY7K9+85TUjGVNcXdR6XhZEzGmCRjTGJx1lUZPkNVME1kxXfyB7TfGLMIeA3oLiIxJyuISLD3ktEuEckUkc0icofvSkQkSkSeF5G9IpIlIrtFZKzP8treM8CjIpIiIktF5GKf5XkuLXqXv5Y/WBHZKiKP+czfKCLrvXHtFpFnRSTSZ/nPIvKGiEwVkYPAnoJ2hIh0E5FFIpIhIoki8oGI1PJZPklEtovIMBHZ6d3mdyLSJN96+nvjzxCR/SLypohU91n+loh8LyL3iMhuIEtEwr2v+1lEjotIkogsFJEuPq/bDTiBN0+eSXvL81yW8pnv730/6SKyRUQG5Yuzg4is8H5eCSJyvXcfjitoH3lf10lEvhGRZBFJFZGVItI1X52rRWSbiKR531Ocz7KqIvKeiOzx7qPfROQBEZHi7iPvawv7Lu71/v+Tdx/tLoHPLc/lMBFpIyILROSE9/1vFZHhZ/MZesuai8hs73tNF5GNInJlEZ/NPd79nun9TB8VkSDvsvO8n9n9PvVbeWO8/Rw/m33e78DrYv2duFNE/hDr9/Oa+Bw4ej+3WSIyTUSOeWN5TUTCinhPhf7GKwRjjP47x3/AW8D3PvP1gIWAC4jMV28jMABoCgwBTgC3eZcL8DOwE7gGaAZcDIz2Lg8HtgBzgM7AecCjQBbQylunCWCAeO/87UAiEOoTRxdvnRbe+RHeOsN9trkReNfnNT8DKcB/gdZAuwL2RR0gGfgAaAfEe9e1yKfOJCANWOJ9HxdhXQpdC4i3ziVAOnAPEOet85N3v4rP/kwGPgcu8G7PCVwL3ACcD7QBXgeOA9W9r6vp/Wz+7o23jre8j3e/NMg3vwEY6I3jTe82q3rrRAAHgS+B9kA3rMtb6cC4Qr4zbbz74EPvPogDhgLd8+2jb4BO3ve3Blicb18/DHTE+j7dDKQCt+b7zp3LPirqu9jBu2/+4o2jZgl8bm+R93e0Eet71Nq7/UHAlWf5GdYBDgPfY30XmwNXA5cX8tlMAv7w7qOmwOVYB25TferchPW76wiEeWP95Bw/m7eBVsBVQCbwNfCOt+wKIAO4K99vMRmY6fO6I8BzhfxNGkERv/GK8M/2AMrzP++XxuX9oqZ7f0gGeManTlPAA7TM99oJwHrv9KXe13UuYDsjgH1AUL7yH4HnvdNNyJvIqnh/CNf71H8ZWO4zvxu4M986L/au5+Qf7J+B3wFHEftiqjfGEJ+yC7zrutg7P8k7f55PnRbeskt9tjct37obeetc6LPfTwBRRcTk8P6Ib/IpcwEj8tXrw5kT2V986tT2ll3mnR/t/dxjfeq09NYpLJG9i5Ugz7g/vfvIhTdBeMuGeL9DYYWs9wXgu3zfzbPeR358Fxt4l/fJV37Onxun//FNyv8Z5avvz2c4FTiEzwFlEfshAus3PDBf+S3AiXxlb2L9Jt4Edvl+B87iszlC3t/KPOAYeQ88vwBm59vHuwGnT9ntWEkwsoB9uZsifuMV4Z9eWiy+X4ALsc52pgLLAd9LS52xjnJXey8hpIpIKjAW68gVrCPvRGPM6gK2cRHWkd6JfOvo5bOOPIwxJ4C5WEdiJ+9H3Ih1xIeI1AQaA8/mW+fX3lWc57O6Naboew9tgBXGmGyfGDZg/VFq41PvqDFmu0+d37F+wCfrXATcly+mLd5lvu91qzEm1TcAEWkqIu+KdfkyGevoNdb7Ps/Fep84DwNurIQG1tnCVmNMkk+dbVh/qAvTCfihiP15wBhz1Hce6ztUC0BEHCLysPdy0THvPrqT09/nueyjor6LBTnnz+0MngFe915KmyQiHc8yFrDexzJjTJqf9dtgXfmYk+89vArEen8vJ40BgrCS3DDf78BZfjbZPvOHgN+MMVn5ymrlfRkrjTFun/mlQCjWGWceZ/kbL9eC7A6gAsjw+cO8SUSaAy9hHbHDqfuQPbCO+HwZP7fhALZiXfLIL/86fb0DfO79QvcEooCP8sX1d6xLQPnt85n2949BSXAAT2GdueR3yGf6TDF9hZUU/w/rXk421mXMc22gkn2GMt+DP38/v+Ju9+R2Tm77AeAR4H5gHdal3/uxLkf5CsQ+Oqk4n1sexpipIvI+1mXdS4CxIvK0MabQe4/FdHLfXo91tpXfcZ/p87BuIxjv9HKfZf5+NvkbZZkCyopzsnE2v/FyTRNZyZsEbBWRV71HtWu85Y2MMV8V8Jo1QFUR6VzAkfBqrKO/ZGPMkbOIZQHWD/BGoC/wlfG2DjPGHBaRvcD5xpiZZ7HOgmwGbhWRkJNHmiJyAdbR/iafejVFpLkxZoe3TgugBqeO3lcDbXzP2vwhVqOC1lj3QBZ4yxpw+hFtNtZ9meLaAowSkdiTR+Qicj7WJd3CrAEuFRGHH2e5BbkY+MYYM+tkgfg0BimIn/uoqO/iySSbfx+e0+dWEGPMTuA/wH9E5GHgIU5d6fDnM1wDjBaRSD/PyjZjXaJrZoyZX1AlbyOJj7z/1gMzRGS5z/s+p8/mLFwkIk6fs7IeWPfsduSvWAq/8TJLLy2WMGNMAlYDgMe989uBWcBMERnubfl0gYiMFJF/eV/2I1Yz/o/Faq3WVER6isgo7/L3sa7FzxORAWK1UOwqIo+IyDWFxOLCuml+F9YR4dv5qjwK3CtWy6y2InK+iFwjIq+ew1t/GYgB3vKuKx7r6HyxMWaxT710rBZnnUWkszem9cAP3uUTgKu9LasuFKvl2UCxWk6GF7L9ROAo1h+vFiLSHatBRUa+eruAviJST0RqnMP7POl9rHtk74hIe7FaHb7h3V5hZ2pPY11qe9+7D5qL1dqx+1ls+zegj4j09b7Xx4CuRb0I//ZRUd/FY973PUBE6ohIVW/5uX5ueYjVYnKGiFzi3XYHrDOzLT7V/PkM/4P19+0Lb/xNReRKydfy9CTv5c4ngCdE5P+8v4U2YrX4e8qn6otYSXQM1r2vRcCHcurxhnP9bPxVHSt5thKRK7BuZ7xaSLIuyd94maWJrHRMx/qh9/HO3w48h/Wl2oL1R/tvWC3DMNYd2CuA+VitA38D3sM6U8EYkwn0xjrqPXmj+TOs+3J/FBHLyZZRSZy6No53ve9itWC7ElgJrMI6o9x/tm/Yew9pAFZjgFVYl7A2AX/NV/Ug1iMKs7EuaaVjNaow3vX8hHU5qT3WH9SNWPsuhdMvvfhu34N1Wai59zVvAc97t+frAaz7J7ux/qifE2NMOlarttpY7/c97/ZSsY7sC3rdr1gNE2pitehb743JXdBrzmCq97VfYF3Wqor1B7aomIvcR358Fz1YlyVvwLo0tc5bfk6f2xm4vO/nDazL6QuwWh8O86lT5GdojDmI1VoxxfteNmMdXMqZ6ntfMxX4B9ZtgQ1Y38/7vdtBRG7AaoV4ozEm1buvRmBdZnzCu5pz+mzOwmzve1qCdVb4FVYryYLeU4n9xsuyk81ilSp1IjIJuNkYU2FuMvsSkcZYf/QGG2O+tDkcVcGIyM/AdmPMqKLqVjZ6j0ypcyQiN2Md2e7Cah32NNYZ8rd2xqVUZaOJTKlzVx2YDNTHalSzFOu5vaxCX6WUKlF6aVEppVS5po09lFJKlWvl6tJiUlKSnj4qpVQFFhsbW2DL0oLoGZlSSqlyTROZUkqpck0TWQWWkJBgdwjlhu4r/+m+8p/uq8DQRKaUUqpc00SmlFKqXNNEppRSqlzTRKaUUqpcC0giE5FZInJERDYVsFxE5EWxRq3dKOc2IqxSSqlKKFBnZG9hjSlUkEFYYzTFYQ158koAYlJKKVUBBKRnD2PMIhFpUkiVq4F3vOP7rBCRKiJS1zumkFJKqVLgSNqBpBf8Z1bc2QTt+w4TFOmdzyL49/fwxDQrsRiyXULOdd8Xax1lpYuq+sBen/l93rIC97A+n+Ef3U/+033lP91X/ivpfRWcdZhqR77FiBOHJ4cGu14GwCNn9+fcYVznHIPj6Jpzfu1JxsBnv7bi4fn9WH1d8dZVVhLZWYuLi7M7hDIvISFB95OfdF/5T/eV/3L3lfEgmX/mljtSduNI2gmSt1tByUklaM83mLDqZ1xfSMKHBW6rOInJVadHIQszMOE1cde6yJr35OCJaY4ntvk5b2/TtjTum7SdX9amnPM6fJWVRLYfaOgz34AKNhS3UqpykcxE6u98ifAD2YQkfFTi63fV6IC7dlcrsVRrQ3aLm4Cz7G9XBBzBJR5bUdxHjrJy3Tpq1ozg4Ye7Fnt9ZSWRzQXGiMhHQFcgSe+PKaXKHY8bR+IWgnfMIWzj88TkXxxaBbyXAB2Zx8hu/lfyJx9xpeGJaYa7aqszbsKE18TVcEApBF96/vwzgzlzfmP06AsQEdq2rcnbb19J376NiI4OKfb6A5LIRORDoA9QQ0T2AROBYABjzH+B+cDlwHYgHbg1EHEppdRZ87gI3jEHPKcGAg/e8RniySHo0NLTqrurtSWn2bXkNL0aT+x5gYzUdhkZLv7733U899wqkpOzadasCv36NQFg8OCS2xeBarU4tIjlBvi/QMSilFJ+cWcj6YcI/fVlwCDZyQRv/wSh6GERPeG1QJxsbTWdBh2uLP1YyxiPx/Dxx1t5/PHl7Ntn3Qfr168xDRpEl8r2ysqlRaWUCijJOErIltdAnAAEHVwCOangDCPo8IoiX2/EQU7csJNzIE5c9S7GVa8PJrwGABmVsHXnwoV7GTduEb/+ehSAdu1qMnVqL/r0aVRq29REppSqPDwuIr4bRvDeb8/qZa5aF5HT/K/gceGu3g5PtXaYsKqlFGT5tnjxXn799Sj160cxblwPhgxphcNx1oM+nxVNZEqpisV4IDv5tGJn0nai5vY7rdxdvR05jQYBIK4MchoOAEcQJiQGT9XWpzWRV3kdPJjKrl1J9OhRH4B77+1EbGwoo0ZdQHh4YFKMJjKlVLkn6YcJ2foGoZv+i+ScnsTOJOW6FXiqtizlyCqulJRsXnxxDTNmrCE2NpTVq0cQGRlMTEwo99zTKaCxaCJTSpU7knGMkN/fxTiCCTqyiuBdX5xWx4TE5i9BspPJbnotGZfM0jOtc+RyeXjnnU08+eQKjh5NB+DSS5uQlpZNZGTgn0kDTWRKqbLOeHAeXErwrv8hWYlgPITs+t8Zq7pjW5B1wb3kNL0GgqMCHGjFZozh6693MmnSEn7/PRGALl3qMmVKL7p1q2drbJrIlFL2MwbHid8J/fVlTIjVRNuRtAPn0dU4fLp2yi+nXh881Voj2clkdvwXJqphgXVV8bjdhgkTlrB9eyJNm8YyaVI8gwefh5SBM1tNZEqpwMpOwfnnBoL2/UDIjtl4ohqd8UHiM8mpfwk5zf8COHDVuxgT1aB0Y63kdu9OIioqmBo1IggKcvDEExezc+cJRo5sT0iI0+7wcmkiU0qVPncWQXsWEPrrDIKO/JJnkSN1b5757PNvwV2lBQDiycFVuyvuam3gtHteqrQkJmbyzDMrmTlzA8OHt+Hf/74EgAEDmtoc2ZlpIlNKlTjJTMR5aAkAwX/MP2Ov7e6YZpiohuQ0vhx31VZ4qrXFhFULdKjKR1aWi9de28C//72SEyesLrgyM10YY8rEJcSCaCJTSpUYyThGxPc3F9ozRmb7+8huOQIT0yRwgalCeTyGzz77jSlTlrFnj/X4wsUXN2TKlF5ceGEtm6MrmiYypVSxSMYxgnfMJnjHbIKOrs6zzFWvNyY4ChDSL34ZQqvYE6Qq1KZNRxk16hsAWrWqzuTJ8fTv36RMn4X50kSmlDprkrKbmI8vxCBn7ETXVacH6ZfMwkTUsSE65Y/9+1OoX99qIdq+fS1uv/1C2ratwbBhrQkKctgc3dnRRKaUKprHhfPIKoIOLKLz2idzi32TmLtKS3KaXUvWhf+wZbBG5Z8jR9KYNm0Fb7+9iS+//Gtu11JPP93H3sCKQROZUioP55FVRPw4EhMcjTNxS6F1s1qPJuuCf1hnXuXkMlRllZaWw4wZa3nxxdWkpubgdApr1x7OTWTlmSYypRQAoeumE7bm8ULreMJqkuWIhA5/J7vlCE1e5YDb7eH997fwxBPLOXQoDYCBA5sxeXI8559fMVqJaiJTqjLz5BC+8C5Cdsw+bVF2i5vIbn4D7tpdwBlmFYqQkJBAXFxcgANV5+qFF1YzZcoyADp0qM3Uqb2Ij69YD5JrIlOqkpHM44Rs+g+OlD2E7PjktOXJN6zXpvHlXFpaTm4HviNGtON//0vg3ns78Ze/nF/qY4PZQROZUpWAI2knQft/IPj39wk6tv6MdVKuXYynersAR6ZK0t69yUyduoxVqw6yYsVwQkODqFYtnIULh5WbpvTnQhOZUhWVMYRse4vwpfefcbGrXm/c1VqT0+yvuGsFdvwoVbKSkrJ47rlVvPLKOrKy3AQHO1i16lDuJcSKnMRAE5lSFYvxELLpFULXP4MjK/G0xdnnDQFPDhnxL4C3l3lVfmVnu3njjY1Mn/4Lx49nAnDddS0YP74nTZpUnr4pNZEpVd7lpBL59XWndcbrK3XQF7jrxoOj7PRYrorv+uv/x8KFVqfL3bvX57HHetGpU+V7CF0TmVLlkSeH4B1zCF9yH+LOPGOV9D4zcTW4VDvirWA8HpPbYGPYsNYcOJDKpEnxXH55swp/CbEgmsiUKkeCd35O+E+3IcZz2jJPdGNSB/+ACa2qZ14V0I4diUyevJTGjWOZOrUXANdf35K//KUFwcGV+/PWRKZUGeY8soagfd8TtPe70zrkPSlt4BxcdXpCUFiAo1OB8OefGTz11C/MmrURl8tDlSqh/OtfXYmKCsHhEBx60KKJTKmyKvrDNjjS9p9xWVr/93E16AfO0ABHpQIlI8PFf/+7jueeW0VycjYicPPNbRg7tjtRUSF2h1emaCJTym6uTMDgSN6F88hqgg4tIWR73geVs1vchAmpQnbcUDzV29oTpwqYP//MoHfvD9i3LwWAfv0aM3lyL9q0qWFzZGWTJjKl7JCdRNS8q3D+ubHIqkkj/9R7XpVM9erhtGlTg6pVw5g6tRd9+jSyO6QyTROZUoFkDM5j64n6ou/pi5yhiDsLV+1uuGt2Iqdhf9z1+wQ+RhVwmzcfY9KkJYwd250OHWoD8OqrlxETE1ohu5QqaZrIlAoQx/EtRH/WI0+Zq05P0vu8iomqWJ24Kv8cOJDKE08s54MPtuQ2q//446sBqFJFG+/4SxOZUqUpO4Wo//VBshJxZB3Psyiz83iyLnzApsCUnVJSsnnhhdXMmLGWjAwXQUEORo26gH/+s4vdoZVLmsiUKiVBexYQ+e2Q08qz2txJZvdpNkSkyoIlS/Zx663zOXo0HYCrrjqPSZN60rx5VZsjK78ClshEZCDwAuAEXjfGTMu3vBHwNlDFW+dhY8z8QMWnVIlxZRC+aAwhO+fkFrljmpJ+yVt4qrXVhhuV3HnnVSU9PYcuXeoyZUovunWrZ3dI5V5AEpmIOIEZQH9gH7BKROYaY3zHUR8HfGKMeUVEWgPzgSaBiE+pkhC0+0sivx9+Wnnq1T/hrtnBhohUWbBmzSFmzdrICy/0IyjIQZ06kfz441BatKhaabuUKmmBOiPrAmw3xuwEEJGPgKsB30RmgBjvdCxwIECxKVUskplIzHtNTys3zlBS/roKE61Npyuj3buTePTRdXz7rfWnrGvXetxyi/UM4Pnna/+XJSlQiaw+sNdnfh/QNV+dScC3InIPEAn0C0xoSp2F7CSC9v+MI3Uvwbu/QrKTcSZuyVMlvdeL5MTdpJcQK6nExEyeeWYlM2duIDvbTViYk7vu6sDVV8fZHVqFVZYaewwF3jLG/FtEugPvikhbY87QOyqQkJAQ2OjKKd1P/jvTvnK4M6l25Gtijq+g2rEfC3398Zr92NnqCRCBHTtLK8wyQb9XZ/a//+3hxRe3kpLiQgSuuKI+d955PnXqhHPkyB6OHLE7wrIpLq54ST5QiWw/0NBnvoG3zNdtwEAAY8xyEQkDagBn/OiL+8Yrg4SEBN1Pfjq5r5yHVxK54HrcVVrg/HMT4s44Y33jCCan2bV4YprhrtoKV/1LcIZEUxn2tn6vClazZiYpKb/Su3dDpkzpRUREku6rAAhUIlsFxIlIU6wEdiMwLF+dPcClwFsi0goIA44GKD5VyYWnbidqzt9yLxMGHVmVZ7lxhJDV9m5cjQbgrt3dOutSld6SJfvYtSuJ4cPbAFanvk2bxnLxxQ0RERISkmyOsHI460QmIrWMMWd1gmyMcYnIGGABVtP6WcaYzSIyBVhtjJkLPADMFJH7sRp+jDDGmLONT6mz4fjzVyJ+vJU2SdvzlGd0ewJ3zc4YZyie6u01cak8fvvtOBMnLuGbb3YSERFEv36NqVs3iqAgB717a+OeQPMrkYlILPAScD3gASJF5CqgszFmoj/r8D4TNj9f2QSf6S1ATz/jVqpYJP0Q0R9fgLiz8pRntb2LrHZjMJH1bYpMlWWHD6cxbdoK3nlnE263ITIymHvv7URMjA6nYyd/z8heAVKBFsDJ7rp/Af4N+JXIlCozXJnEfNAyT1FS1W5w9WcQFGFTUKosc7k8PPvsKl54YTVpaTk4ncLIke14+OFu1KoVaXd4lZ6/iawf0MAYky0iBsAYc0REapdeaEqVIFc6Yb9MQLJPELJjdm6xu3p7Uq/+kYQdu4jTJKYK4HQKCxfuIS0th0GDmjFpUrw+C1aG+JvIkoFqwKGTBSLSEDhcGkEpVVIcf27EeXwrEQvvOG2Zu2prUq9dZENUqqwzxvD997tp1CiW88+vhojw1FN9OHEii/h4HamgrPE3kc0CPhWRsYBDRC4CngReLbXIlCoOY4h5q85p98BMcBQZPZ/DE1EHd71eNgWnyrING44wYcJiFi7cy4ABTfjkk2sAaNu2ps2RqYL4m8ieBLKAN7CaxX+AlcSeK6W4lDpnIRteIHxV3lu3rtrdcdfuQmanseDUG/PqdHv3JvPYY8v55JOtGAOxsaH06tUwd5wwVXb5m8iqG2P+jdW4I5eI1ACOlXhUSp2DkF9nEP7Lo3nKTEgsybf8YVNEqjxISsriuedW8cor68jKchMS4mT06At48MEuVK2qg1uWB/4msp2c6tDX1+9Y986Uso3jz1+J/vz0y4TJw37DRGh7JFW4Eycy+c9/1pGd7ea661owfnxPmjSJtTssdRb8TWSnnVeLSBTWM2VK2SZk44uEr5yQpyy9z2vkNL9eH2JWZ3SyIcellzbB4RAaN45l+vQ+tG1bk06d6tgdnjoHhSYyEdmF1ctGuIjk7wW1BjDn9FcpVfok/QjRn1yIuNJzyzI7jSOrw4M2RqXKul9+OcD48YtZufIgr702kBtusJ4n/Nvf2tkcmSqOos7IRmGdjc0FRvuUG+CwMWZzaQWmVEFC1z1D2JrH8pSlDv4Od62LbIpIlXU7diQyadJSvvzS6oqsZs0IHA6bg1IlptBEZoz5AUBE6hhjkgMTklIFC1v6IKFbX8+dz2pzJ5ndp9kYkSrLjh1L56mnfuHNN3/F5fIQHh7EmDGduPfeTkRHh9gdniohft0jM8Yki0hboBfWJUXxWTallGJT6hSPm9DVU/MkseShWzCR9WwMSpV1n376GzNnbsDhEIYPb8PYsd2pWzfK7rBUCfO30+DbsDoN/gHoD3yHNeTKl6UXmlKA8RC65gnC1j+Tpzhp5DFwlKVxYVVZ4HZ7SEhIpGXL6gCMHNmOzZuPcdddHWjTpobN0anS4u9V4oeBy40xVwEZ3v9vANJKLTKlgNBVU05LYslDNmgSU6f56ac/6N37AwYM+Jjjx60BUUNDg3j55f6axCo4f/8a1DbG/Oyd9oiIA5gHvAOMLI3AlMIYwjY+nzubcv1qPLHn2RiQKos2bTrKxIlL+OEH68H3Bg2i2bUriWrVwm2OTAWKv4lsn4g0Nsb8ASQAV2D16JFTapGpSi109WN5zsRSrl2iSUzlceBAKo8/vowPPtiCMRATE8L991/EnXd2IDxcz9grE38/7X8DbYE/gMeAT4Fg4B+lFJeqxPInMXe1Nniqt7UxIlUW3X77NyxZso+gIAcjR7bnn//sQo0aOhRPZeRvq8U3fKa/EpGqQKgxJqnUIlOVjiNxK9FzuucpSx6yEROtQ8cra3DL1NRsqlSx+j985JFu/Pe/65k0qSfNm1e1OTplp3M6/zbGZIpIpIg8aYx5pKSDUpVIdgqSnUT07K6IK2/boeShmzGR9W0KTJUVxhjmz9/JpElLaNu2Bm++eQUAPXs2oGdPHRtM+ZHIRORvwIVY98ZeAyKBccCdwLJSjU5VXMYQsuU1wpf/67RFWS1vJTNeRwhSsHbtIcaNW8yyZfsBcLsNyclZxMToUDzqlKL6WnwaGI6VsIYC3YDuwBqglzFmfalHqCocx4nfiZ7dJU+ZCYrAhMSSMmS9jhem2L07ialTlzJnzu8AVKsWxj//2ZWRI9sTEuK0OTpV1hR1RnYjcLExJkFEWgGbgaHGmI9LPzRV0ZwpgYHeB1N5JSZm0qPHu6SnuwgLc3LXXR24776LiI3VA9AtMiEAACAASURBVBx1ZkUlsirGmAQAY8xWEUnXJKbOVf4kln7xDHJa3GRTNKosycpyERLiRESoWjWMm25qQ3JyNuPGdadhwzMNhajUKUUlMhGRhpzqW9GVbx5jzJ7SCk5VHJH/65M7ndHzObJbjtDxwhQej2HOnN+YOnUZTzxxMVdeaT0r+NRTfXA49Puh/FNUIosEdpN3YE3fceMNoBesVaEi511F0LFTt1M1iSmAxYv3MmHCEtatOwzARx9tzU1kmsTU2SgqkQUHJApVYUW/2wRH1onc+aSRf2oSq+R+++04EyYsZsGCXQDUqRPJ2LHduemm1jZHpsqrosYjcwcqEFXxOA+vzJPEkm9KAIeewFdm3367i6FD5+J2GyIjg/n73zvzf//XkchIPWZW5047JFOlw5VO1JcDcmeTbjsOokPyVkbGGMR7Fh4f34C6daMYMKAJDz/cjVq1Im2OTlUEmshUiQv642sivxuaO596+ReaxCoht9vD++9vYebMDcyb91diYkKJiAhm5cpbiIjQMzBVcjSRqRIV9XlvnH9uyJ131emOu15vGyNSgWaM4bvvdjNx4hK2bv0TsBpy3H77hQCaxFSJ8zuRiUgQcBFQ3xgzW0TCAYwxGaUVnCpfoj9ojSP9QO58evzz5LQcYV9AKuDWrz/ChAmLWbRoLwCNGsUwcWJPrr22hc2RqYrMr0QmIm2AL7yzdYDZwKXATVhdV6lKLuKHv+VJYkkjDkKQDmxYmUybtoJp01YAUKVKKA8+2JXRo9sTGqoXflTp8vfGxSvAY8aY8zg1mObPQC9/NyQiA0XkNxHZLiIPF1DnBhHZIiKbReQDf9et7BX9XnOCd32RO59023FNYpVQ5851CAlxMmZMR9avv5UxYzpqElMB4e+3rB3wtnfaABhjUkXEr1HsRMQJzAD6A/uAVSIy1xizxadOHPAI0NMYkygitfyMTdnFnUXsm7XzFCXdslcbdlQC2dluZs3ayN69KTz++MUAXHppYzZsuJW6daNsjk5VNv4msj+ADsDakwUi0hnY4efruwDbjTE7va/9CLga2OJTZzQwwxiTCGCMOeLnupUdjDk9iY06UUBlVVEYY/j++4O89toSdu1KQgRGjGhLXFw1RESTmLKFv4lsAjBPRP4DhIjIQ8D/AXf5+fr6wF6f+X1A13x1WgCIyFKsbq8mGWO+8XP9KoAi511J0MElecqSRv5pUzQqUFasOMD48YtYteoQAHFxVZk8OZ7zztPRmZW9/Epkxpi5InIQ66xpKXA+MMQY80sJxxIH9AEaAItEpJ0x5oyH+QkJCSW46YqrpPdT54UXnVa2+uKVsGNniW7HDvqdOjO32zB27Fp+/NFKYNWqhTB6dAuuuaYhQUEetm/fbnOEZZt+r4oWFxdXrNf722qxqjFmFbDqHLezH2joM9/AW+ZrH/CLMSYH2CUiv2MltjNus7hvvDJISEgo0f0U80aNPPPJN+/EhFWjInwSJb2vKppatXYRHn6MMWM6ccUVVbjwwlZ2h1Qu6PcqMPy9K79fROaKyJCTz4+dpVVAnIg0FZEQrAE75+ar8z+sszFEpAbWpcbyf5hfAQTt/Z7Y16sgxpVbljTqBCasmo1RqdKSkeHi2WdXsnDhqRGaJk+OZ82aETz6aHciI7Uloipb/P1GNgWGAPcDr4nIXOAD4Ft/OhY2xrhEZAywAOv+1yxjzGYRmQKsNsbM9S4bICJbADfwkDFGb7zYyeMm8ssBBB1dk1tkEJJvO25jUKq0eDyGjz7ayuOPL2P//lTatKnB4sU34XAItWtrn4iq7PL3Htlh4EXgRRFpBgwDngFqALULe63POuYD8/OVTfCZNsA/vP+U3Ywhdlb1PEVpl32Kq0E/HYalAvrppz8YP34xmzYdA6Bdu5o89lgvHRdMlQvnco0g1vsvGkgr2XBUWSBpB4j5MO/YUEkjDkFQmE0RqdKyb18K9933Pd9/b42X26BBNOPG9eCGG1pqElPlhr+NPVpgdUU1DCuJfQrcaIxZVoqxKRs4knYS/WnH3HnjDCd5xH59yLmCio4OYd26I8TEhPCPf1zEHXd0IDxc74Gp8sXfb+wq4HPgXuB7HXCzgspJy5PEMno+R3arW20MSJW05OQsZs7cwN13dyQ8PIjY2FDeeecKWrasTvXq2q2YKp/8TWS1jTGZpRqJso/Hfdr9sPSL/0NOi2E2BaRKWk6Om7ff3sS0aSs4diwDEfjHP7oA0LNnA5ujU6p4CkxkIjLUGPOhd/YGKeAGvzHmndIITAWIK4PYt+rmKcpqOUKTWAVhjGH+/J1MmrSEhIREALp0qUt8vCYvVXEUdkY2AjiZyEYXUMcAmsjKKUk/QswHeceJSrotUVslVhDr1x/hkUcWsny51fdAs2ZVmDixJ4MHn0dBB6ZKlUcFJjJjzGU+034P16LKB+eBxUTNvyp33hNem5QhGzSJVSB//JHE8uX7qVYtjH/9qxu33tqOkBCn3WEpVeL8aoomImfsJkpEVpRsOKrUGQ+hKyflSWJZrUeTctNv2ry+nEtMzGTu3FP9Hg4efB7Tp/dl3bpbueOOCzWJqQrL38YeLQso1/HLyxHJ/JOY95rnKUu79G1cja+0KSJVEjIzXcycuYFnnllJWloOK1YM57zzqiIijB59gd3hKVXqCk1kIjLLOxniM31SE2BraQSlSp7jRALRs/P2XJ88ZD0muok9Aali83gMc+b8xpQpS9m7NwWAPn0aYXWSo1TlUdQZ2f4Cpg2wBvi4xCNSJSroj3mEL/o/HFmnRsNxV29P6pVfQ7D2n1deLV68l/HjF7N+vTX+bOvW1ZkypReXXtpYG3KoSqfQRGaMGQ/WvTBjzLzAhKRKitOVSuTCm/KUpfd+lZy4ITZFpErKzJkbWL/+CHXrRjJ2bA+GDWuF06m9r6jKqbDnyHoaY5Z6Z1NE5OIz1TPGLCqVyNS5c2cTNac7HZJ35Bal93qJnOZ/hSDtvaE8Onw4jaSkLFq0sIbOmTQpnnbtanL33R2JjAy2OTql7FXYGdkbnGrk8X4BdQzQqEQjUsXjcRH7Zq08RVlt7iDn/OE2BaSKIy0th5deWsNLL62hdevqfPvtEESEZs2q8NBDXe0OT6kyobDnyFr6TDcsqJ4qI4wh5NeXCV85PrfIFRRN2tBfIbSKjYGpc+F2e3j//S088cRyDh2yBpmoUSOClJRsYmJCbY5OqbLlnLq5FpFegFt7vy8jPC5iZ9XIU+Su3p71bWYSp0msXDHG8N13u5k4cQlbt1rjynbsWJspU3ppt1JKFcDfB6J/FpF47/SDwGfAHBH5V2kGp/yTP4mlXvkNqdcu0qFXyqGkpCxGjfqarVv/pFGjGN54YxDff3+jJjGlCuHvGVk74GQvHncAfYAUYDHwVMmHpfziySHyq1MPMxtHCMkjj9gYkDoXe/cmU7t2JCEhTqpUCWP8+J5kZbkZPbo9oaE6NphSRfH3kN0BeESkGRBkjNlsjNkDVCu90FRRIhbcQNCRX3Lnk289ZGM06mydOJHJxImL6dz5bWbN2phbPnr0BYwZ01GTmFJ+8veXsgx4HqiHNcAm3qT2ZynFpQpjDEF7viF4/0+5RcnDftNLieVEdrabN97YyPTpv3D8uDXM344dJ4p4lVKqIP4mshHAQ8BvwDRvWWvgpVKISRXGGGJmVUeMJ7coafhubZlYDhhj+OKLBCZPXsquXUkA9OxZn6lTe9GxYx2bo1Oq/PIrkRljjgL/zFf2FfBVaQSlChb+48g8SSz1qm81iZUTX3+9kxEj5gPQokVVJk2KZ9CgZtqllFLF5FciE5Eg4BFgOFAfq9/Fd4Fpxpic0gtP5fK4if6wFY6MU405kkbp5aiy7sSJTKpUsYbHGTiwGf36Nebyy5tzyy1tCQrSS8FKlQR/Ly0+BfQE7gP+ABoD44AqwAOlE5oCCNr7HRE/3orkpOYpT7plr00RKX8cO5bOU0/9wocfbmHZsuE0ahSDwyHMnn2t3aEpVeH4m8huADoYY4555zd7B9tcjyayUiNpB4hccP1p5Um3HgFniA0RqaKkp+fwyivreP751aSkZONwCAsX7mX48DZ2h6ZUheVvInMCnnxlHvxvvq/OhjEE7ZlP5Heneq5PG/ARroYDtGViGeV2e/j44208/vgy9u+3zp7792/CpEnxtGlTo4hXK6WKw99ENhuYKyITgT1YlxYneMtVCXIeWU3U3H55yjK6PYmr0UCbIlL+ePjhhcycuQGAdu1q8thjvejdW/vTVioQ/E1kDwETsXrEr4fV2OMjYHIpxVU5eVynJbG0y2bjativgBcoO7lcntwGGyNGtGPBgl2MHdudG25oicOhLRGVChR/m99nAWO9/1Qp8e0zMW3gZ7gaXGJjNKogBw6k8vjjyzhwIJXPPrsWEaFNmxqsWzdCB7dUygaFJjIRicM6C2sLrAVGerumUiXJGMKWn3pML6fRQE1iZVBychYvvriGGTPWkpHhIijIwe+/J3L++VZPbZrElLJHUWdkL2NdRnwGGIbVTdVfSjuoSsWdfdpAmOn9P7QpGHUmOTlu3n57E9OmreDYsQwArr46jokTe9KsmT6MrpTdikpknYCGxpgMEfkJ2BaAmCqPrBPEvtskT1HS8N2gPT2UGR6PoV+/j9mwwXoQvUuXukyd2ouuXevZHJlS6qSiElmIMSYDwBiTIiLhAYipUnAeWUPU3Etz501QJMm37AZHsH1BqdM4HEL//k1ISclm4sSeDB58nnYppVQZU1QiCxWRCT7z4fnmMcZM8WdDIjIQeAHrmbTXjTHTCqh3HVaz/ouMMav9WXd5I+mH8iSxrJa3khn/nI0RqZN2705iypSl9OnTiFtuaQvAAw904Z//7EpIiNPm6JRSZ1JUIvsEiPOZn51v3vizERFxAjOA/sA+YJWIzDXGbMlXLxr4O/DL6WupOCJ+GJE7nXr5XNz1LrYvGAVAUlI2Y8daz4Ll5HhYu/YwN93UGqfTQXi4jgumVFlW6C/UGDO8hLbTBdhujNkJICIfAVcDW/LVm4rVr+NDJbTdsic7iaDD1mDbOY0GahKzWWami5kzN/D008tJSXEhAjfe2Ipx43poK0SlyolAHWrWB3x7ud0HdPWtICIdsRqWzBORIhNZQkJCyUYYADHHf6HFr2Ny57fVuYOsUn4f5XE/BcqePWmMGfMLBw9aLRG7dKnBvfe25PzzY8nIOERCgo64XRD9XvlP91XR4uLiiq5UiDJxzUREHMCzWAN4+qW4bzzQJPM4MQtPJbHM9vfRqH3fUt1mQkJCudtPgdSkiZuoqA20bh3BHXc045ZbemhDDj/o98p/uq8CI1DXTvYDDX3mG3jLTorGeuj6ZxHZDXTD6tuxc4DiK3Ux7zXLnU7r/wFZXSbZF0wltW3bn4wYMY8jR9IACA528tln17J48U306FFLk5hS5VSgzshWAXEi0hQrgd2I9YA1AMaYJCC3fyYR+Rl4sEK0WjSG2Deq5s5mN/sLrsaX2xhQ5XPoUBrTpi3nnXc24/EYataMYPp062y4YcMYm6NTShWX34lMRPpiJaDaxphrvPe0oo0xC4t6rTHGJSJjgAVYze9nGWM2i8gUYLUxZu45xl/mBe+ck2c+o+8bNkVS+aSmZvPyy2t56aU1pKXl4HQKI0e246GHutgdmlKqBPmVyETkbuBBYBZWMgPIBh4H4v1ZhzFmPjA/X9mEAur28Wed5UHET6Nyp5NGnbAxksplwYJd3Hvvdxw+nA7AoEHNmDw5nhYtqtkcmVKqpPl7RvYA0M8Ys1NETo4IvRVoVTphVQyS+WfudHrvV2yMpPKpUSOcw4fT6dixNlOn9qJnzwZ2h6SUKiX+JrJo4A/v9MmHoIOwzspUASLnDsidzokbamMkFd/69Uf45pudPPxwNwA6darDN9/cQJcudXVsMKUqOH8T2RKsS4tP+ZT9H1Dk/bFKy3hwJu8AwFWnp83BVFx79iTz2GPL+OQTqz/rnj3r06uX1UC2Wzft2FepysDfRHYP8JWIjAaiRWQz1tmYNr8rQOwbp+7FpA3QYVlK2okTmTz77CpefXU9WVluQkKc3H77BbRrV9Pu0JRSAebvCNH7va0UewCNsHrpWG6McZdmcOVV6JoncqdzGl8JIdrEuyS98cYGHntsOYmJmQD89a/nM25cD5o0ibU5MqWUHfxufm+MMcBS7z9VAOeBRYStezp3Pr3/ezZGUzHt2HGCxMRMevasz9SpvejYsY7dISmlbORv8/tdFNDTvTGm2ZnKKx1XOjHvNkPcmblFKdetsDGgimPFigNkZOTQt29jAB56qCu9ejVk4MCm2huHUsrvM7JR+ebrYt0305s/AJ4cYt/K27Ag5drFeKq2tCmgimH79kQmTVrCV1/toFGjGFatuoXQ0CCqVg1j0CA9flJKWfy9R/ZD/jIR+QHrAefnSzqo8iZ21qkGBu7YOFL/sgScoTZGVL4dO5bOU0/9wptv/orL5SEiIoghQ1rhdvs1/J1SqpIpTl+LGUClPywOXXvqiQRPaFVSr19lYzTlW2amixkz1vL886tJScnG4RCGD2/D2LHdqVs3yu7wlFJllL/3yPJ3JRUBXAF8W+IRlSc5aYStfTJ3NmX4LhuDKf9E4O23N5GSkk3//k2YPDme1q1rFP1CpVSl5u8ZWf4BddKAGcBbJRpNeZKTRuzb9XNnU6752b5YyrGffvqDCy+sTdWqYYSGBvHss5cQHOygd+9GdoemlConikxkIuIEvgM+McZkFlW/Usg6Qey7TXJncxoOwFPjQvviKYc2bTrKxIlL+OGHPxgzpiOPPXYxAP36NbE3MKVUuVNkIjPGuEXkJWPMO4EIqMzLSc2TxNzVLyD9sk/si6ecOXAglccfX8YHH2zBGIiJCaFePb3/pZQ6d/5eWpwnIpd7h2Kp1CLnXZk7ndP0atIvedPGaMqP5OQsXnxxDTNmrCUjw0VQkINRo9rz0ENdqV493O7wlFLlmL+JzAF8JiJLsLqnym0HbYwZWRqBlUnGEHRsPQCe0GqkX/q2zQGVHxs3HuWZZ1YCcPXVcUyc2JNmzarYHJVSqiLwN5ElANNLM5DyIHTN47nTKTdutDGSss8Yw7p1h3O7j4qPb8CDD3ZhwIAmdOmivdIrpUpOoYlMRIYaYz40xowPVEBlljGErX/m1Hyw3tcpyOrVBxk/fjHLlx/gxx9vzE1m48b1sDkypVRF5Chi+asBiaKsc2cT49PUPu2yT20MpuzavTuJW2+dR79+H7N8+QGqVQvjwIFUu8NSSlVwRV1arPQ9sjr3LyTq66vzlLka9LMpmrLp+PEMnnlmJTNnbiAnx0NYmJO77urAffddRGysdtWllCpdRSUyp4j0pZCEZoz5sWRDKjscidvyJDF3lfNJvWah1QWFyjVt2i+89tp6RODGG1sxblwPGjSItjsspVQlUVQiCwXeoOBEZqjA/S1Gz+mWO512yVu4ml1jYzRlh8djOHQoLff5rwceuIi9e5N55JFutG9fy+bolFKVTVGJLK2yjjfmPLoud9pVp4cmMa/Fi/cyfvxi0tNzWLZsOEFBDmrXjuTDDwfbHZpSqpIqqrFHpeTcv5CoL/rmzqdd8ZWN0ZQN27b9yZAhX3DVVXNYv/4IKSnZ7Nx5wu6wlFJKG3vk5zi2Ps99sfT4F0Aqb74/fDiNJ59czjvvbMbjMURFBfP3v3fm7rs7EhkZbHd4SilVeCIzxlSqO/ZBf8wn8rthufOpV87HXafyPvvk8Rguv/xTduw4gdMpjBzZjocf7katWpF2h6aUUrmKM7BmheObxNL7vlEpk5jL5cHl8hAWFoTDIdx7bye++WYXkyfH06JFNbvDU0qp01Tea2b5OA//kjuddunb5DS/zsZoAs8Yw4IFu4iPf49///vUKNe33NKWDz8crElMKVVmaSLzivrystxpV5PK1QJv/fojDB48hyFDvmDbtuPMm7cdt9sDgOgzc0qpMk4vLQLhi+/NnU7v/WqleeB5z55kHntsGZ98sg2AKlVCeeihrowa1R6nU49xlFLlgyYyIOQ3a8xQ4wwnJ26IzdEExvbtifTs+R5ZWW5CQpzccceFPPDARVSpEmZ3aEopdVYqfSIL2fJ67nTKDWtsjKT0eTwGh8M622zevArdutWjZs0Ixo3rQZMmsTZHp5RS5yZg149EZKCI/CYi20Xk4TMs/4eIbBGRjSLyg4g0DkRcYasm5U6byIo5TpYxhs8//50uXd5hy5ZjgHXv69NPr+H11wdpElNKlWsBSWQi4gRmAIOA1sBQEWmdr9o6oLMxpj0wG3i61APzuJAca5iRlGt+LvXN2WH58v307/8xt946n+3bE5k5c0PuspAQp42RKaVUyQjUpcUuwHZjzE4AEfkIuBrYcrKCMeYnn/orgJtLO6jILwfmTntqXFjamwuo7dsTeeih1fz882EAatWK4JFHujF8eFubI1NKqZIVqERWH9jrM78P6FpI/duAr0szoPAfRxJ0dDUArnq9S3NTAffRR1sZM+Y7XC4PERFBjBnTiXvu6UR0dIjdoSmlVIkrc409RORmoDNQaHZJSEg4520EZx3lgp2f5c6vP28aFGN9ZU29etkEBQlXXNGQO+5oQc2aYRw69AeHDtkdWdlWnO9UZaP7yn+6r4oWFxdXrNcHKpHtBxr6zDfwluUhIv2AR4HexpiswlZYnDcevG1Z7nTSiAPEBUWc87rs5nZ7+Pjjbcydu50PPrgKh0OIi4PNm1tw/Pi+Yn9BKouEhATdV37SfeU/3VeBEahEtgqIE5GmWAnsRmCYbwUR6QC8Cgw0xhwpzWAilvwdAHfV1lCOk9hPP/3B+PGL2bTJaok4b94OrrrqPACqVw/n+HE7o1NKqcAISCIzxrhEZAywAHACs4wxm0VkCrDaGDMXmA5EAZ96u0XaY4wp8b6iHIm/5U5ndn60pFcfEJs2HWXixCX88MMfADRoEM348T244ormNkemlFKBF7B7ZMaY+cD8fGUTfKb7BSKOSJ+xxlyNrwjEJkvUuHGLmDFjLcZATEwI//jHRdxxRwfCw8vc7U6llAqISvXXT9IO4Ei3Wjxkx91oczTnpn79aJxOB7fd1p5//rMr1auH2x2SUkrZqlIlspgPTz2DndHrZRsj8U9Ojpu3396EwyGMHNkegNtua89llzWlWbMqNkenlFJlQ+VJZMaTO+mqGw+OsvvWjTHMm7eDSZOWsn17IjExIVx7bQuqVg0jJMSpSUwppXyU3b/mJSx4x5zc6bRBX9gYSeFWrz7I+PGLWb78AADNmlVh4sSeVKkSanNkSilVNlWKROZI3EbEz6N9CspeH4Opqdncc893fP659fBk9erh/OtfXbn11nYEB5e9eJVSqqyoFIksek633OnUy7+0MZKCRUYGs3dvCmFhTu66qwP33XcRsbF6FqaUUkWp8IksdM0TudPpfWfhrtfLxmhOycx08dpr67nyyvNo1qwKIsJLL/UnOjqEBg2i7Q5PKaXKjQqfyMLWnRoNJqf5X2yMxOLxGGbP/o2pU5eyd28Ka9ce5q23rOfZWrWqbnN0SilV/lToRBa65vHc6bRL37YxEsuiRXuZMGEx69dbPXC1bl2D4cPb2ByVUkqVbxU3kRlD2LrpubOuplcXUrl07dp1gocfXsiCBbsAqFs3kkcf7cHQoa1wOgM2SLdSSlVIFTORGUPsG1VzZ5OHbbMxGHC5PHz//W6iooK5776LuPvuDkREBNsak1JKVRQVMpFFfX6qQUdOwwGYiDoB3X5qajazZ//G3/7WFhEhLq4ar78+iPj4BtSsWX5721dKqbKoQiYy5/FNudPp/T8M2HZdLg/vvbeZJ59czuHD6VSrFs7gwdawKtde2yJgcSilVGVS4RJZ6KrJudNJIw4G5OFnYwwLFuxi0qQlbNtmDQLWsWNt6taNLPVtK1UcxhhSU1PxeDxFV/YKCwsjKSmpFKOqOHRfnc7hcBAVFYV3uK4SUeESWdiG507NBJV+z/Dr1x9m3LjFLFmyD4DGjWOYMKEn117bAoej5D4opUpDamoqoaGhhISE+P2a0NBQwsLCSjGqikP31emys7NJTU0lOrrknpetUIksdN0zudPJQzYGZJvff/8HS5bso0qVUB58sCujR7cnNLRC7VZVgXk8nrNKYkoVV0hICBkZGSW6zorzFzc7hbA1j+XOmuhGpbKZEycy2bbtON261QPg7rs7kJ3t5u67O1Clih55KaVUoFWYRBa68YXc6dTB35X4+rOz3bz++gamT1+JwyGsXTuC2NhQIiKCGTu2e4lvTymllH8qzNO4IVvfAMAd0xx3rYtKbL3GGD7//He6dHmHsWMXkZiYScuW1ThxIrPEtqFUZVatWjXi4+Pp3r07Q4YM4cSJE7nLtm7dylVXXUXnzp3p2LEjTz/9NMaY3OXfffcdffr0oWvXrvTq1YtHH33UjrdQqA0bNjBmzBi7wyjUs88+S4cOHejcuTM//PDDGesMGjSI+Ph44uPjadmyJcOGDQNg8eLFNGrUKHfZU089BVj3wgYNGoTL5Sr1+CvEGZlkHMWRlQhAZpfJRdT23/Ll+xk/fjGrVx8C4PzzqzF5cjyXXda0RFvcKFWZhYeHs2TJEgDuvPNOXn/9dR588EEyMjIYOnQozz77LJdccgnp6enccsstvP7664wePZotW7bw0EMP8cknn9CiRQvcbjdvvfVWicbmcrkICiren8lnn32WBx98MKDbPBvbtm1jzpw5rFixgoMHD3LNNdewZs0anM68Lb6//vrr3Onhw4dz+eWX5853796djz/+OE/9kJAQevfuzWeffcYNN9xQqu+hQpyRhS86dbTjanxFiazTGMNDD/3E6tWHqFUrguefv5SlS29m4MBmmsSUKiVdunTh4MGDAHz66ad07dqVSy65BICIdt7c2gAAEgVJREFUiAimT5/O888/D8ALL7zAAw88QIsW1jOaTqeT22677bR1pqamcvfdd9OjRw969OjBF19YA+vWr18/t84XX3zBXXfdBcBdd93F/fffz6WXXsqECRNo165dnrPEjh07cuTIEY4dO8bw4cPp27cvffv2ZcWKFWfc9ubNm2nXrh0Aa9asoX///vTq1YsBAwaQkGCNP/j+++9z4403ctVVVzF48GAAXnzxRfr27UuPHj144olTo3gMGzaM3r17061btxJJ3PPnz+e6664jNDSUJk2a0KxZM9asWVNg/eTkZBYtWsQVVxT9t/aKK67g008/LXaMRakQZ2RB+38EwFWzMxQjyRw9mo4xhlq1IhERHn/8YpYt288993QiKkpbdqmKL/b1KkXXOYv1JY06UXQlL7fbzcKFCxk+fDhgnSlceOGFeeo0bdqU1NRUkpOT2bp1q1+X7KZPn05MTAzLli0DyJOUCnLgwAG+/fZbnE4nbrebr776iptvvpnVq1fTsGFDatWqxahRo7j77rvp3r07e/fu5brrrmPlypV51rN+/XpatWqVOx8XF8fXX39NUFAQP//8M1OmTOHdd98FYOPGjSxdupSqVavy448/smPHDn788UeMMQwdOpSlS5fSs2dPZsyYQdWqVcnIyOCSSy5h8ODBVKtWLc92H3nkERYvXnza+7ruuuu4//7785QdPHiQzp07587Xq1cv92DiTObNm/f/7Z17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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# train\n",
    "y_train_pred = eec.predict_proba(X_train)[:, 1]\n",
    "plotROC(y_train, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:35:47.031808Z",
     "start_time": "2019-11-22T17:33:51.320719Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done   2 out of   4 | elapsed:  1.9min remaining:  1.9min\n",
      "[Parallel(n_jobs=4)]: Done   4 out of   4 | elapsed:  1.9min finished\n"
     ]
    },
    {
     "data": {
      "image/png": "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vn0B+PPPP+nevTvVq1fnrbfeyiqfmprKddddR1pamsfjD4hE5qlmxaVL99G9+9cMGDCbnTsTady4Ml991YsffriNSy6JKNZ9KVVSlSlThkWLFrF06VIqVarE+++/D8Dp06fp06cPjz32GKtWrWLRokWsWLEi6/nNmzczbNgwpkyZwvLly5k3bx4NGjQo1tiK44/wq6++ygMPPODVfRbE1q1bmTFjBsuWLWP69Ok88cQTpKenX1Duxx9/ZNGiRSxatIgrr7ySG2+8EYBKlSoxceJEHn744fPKh4aG0qlTJ7777juPvwe/T2SuZ2PF2axojGHYsN9Zteog1auH8/rrXVm8+G6uvbZBsXYbVUr9LSoqigMHDgDw7bff0q5dO66++moAwsPDmTRpEq+//joAb7zxBk888QSNGln3aAYHBzNw4MALtpmSksJDDz1Ex44d6dixI99//z0AtWrVyirz/fffM3jwYAAGDx7MY489RteuXRk9ejQtW7Y87yyxdevWHD58mKNHj9KvXz+6dOlCly5dWLZsWY773rRpEy1btgRg9erVdO/endjYWHr06EF8vDX/4Oeff86dd97JjTfeSK9evQB488036dKlCx07duSFF17I2mbfvn3p1KkT7du356OPPipELZ9v9uzZ3HrrrYSFhVGvXj0aNGjA6tWrcy2flJTEggUL6NnTGuy8WrVqtG7dmpCQC69U9ezZk2+//bbIMebHr6+RuQ5JVRxnY0eOnMIYQ/XqZRERnn/+KpYs2cfDD7ehXDnt2aUCX8T7FfMvU4DtJQ46kX8hW3p6OvPnz6dfv36AdaZwxRVXnFemfv36pKSkkJSUxJYtW9xqsps0aRIVKlRgyZIlAOclpdzs37+fn3/+meDgYNLT0/nhhx+4++67WbVqFXXq1KF69eoMGjSIhx56iA4dOrBnzx5uvfVWVqxYcd521q1bR9OmTbOWIyMj+fHHHwkJCWHevHmMGzeOTz/9FIANGzawePFiKlWqxNy5c9m2bRtz587FGEOfPn1YvHgx0dHRTJ48mUqVKnH69GmuvvpqevXqReXKlc/b7zPPPMPChQsveF+33norjz322HnrDhw4QNu2bbOWL7744qyDiZzMmjWLTp06UaFChXzrsVmzZqxZsybfckXl14msuIakOnXqHG+/vZY33ljFDTdcyjvvXANAp0516dSpbrHEqpTK2enTp4mJieHAgQM0atSILl26FOv2582bx7Rp07KWK1bMP1nfdNNNBAdbM7PfcsstvPTSS9x9993MmDGDW265JWu7W7duzXpNcnIyKSkplCtXLmvd4cOHqVq1atZyUlISgwcPZvv27YgI586dy3quc+fOVKpUCYC5c+cyd+5cYmNjATh58iTbtm0jOjqad999lx9++AGAffv2sW3btgsS2Ysvvuhe5RTCjBkzsg428hMcHExoaCjJycnFet9Ydn6dyDIVNomlp2fw5ZdbeOGFpezfnwLAsWNnSEvLICTE71tdlSowd86gzpw5U6w3+WZeIzt16hS33norU6dO5cEHH6RJkyYsXrz4vLI7d+6kXLlyVKhQgSZNmrBu3bqsZruCcr1EcObM+Z23ypb9e1SeqKgotm/fztGjR5k1axbDhg0DrHvwfv311zzronTp0udt+/nnnyc2NpbPP/+cXbt2ccMNN+S4T2MMjz/+OAMGDDhvewsXLmT+/Pn88ssvhIeH07Nnzwtih4KdkdWsWZN9+/ZlLe/fv5+aNWvm+H7++usvVq9ezWeffZbre87u7NmzHr8pvMT+tf7tt51cddUXDBnyC/v3p3DZZdX4/vtb+frrmzSJKeWA8PBwJkyYwL///W/S0tK4/fbbWbZsGfPmzQOsM7enn36aoUOHAjB06FBeffVVEhISACuxuJ55ZerSpQtTp07NWs5sWqxWrRp//PEHGRkZWWc4ORERbrjhBkaMGEHjxo2zzn6uvvpqpkyZklVuw4YNF7w2MjKSHTt2ZC0nJSVlJYkvvvgi13127dqVzz77jJQU6wB7//79HDlyhKSkJCIiIggPD+fPP/9k1apVOb7+xRdfzOqY4fovexIDqzfijBkzOHv2LDt37mTbtm20adMmx+1+//33XHPNNW4npmPHjlGlShVKlfLsbB8l8i/29u0nuO22/7Jp01Fq1y7Pe+9dw7x5fenUqY7ToSlVol1++eU0b96c6dOnU6ZMGb744gsmTZpE27Zt6dixI61ateL+++8HoEWLFrz44osMHDiQqKgoOnTowM6dOy/Y5pNPPsmJEyfo0KED0dHRLFiwAIC4uDjuuOMOevToQY0aNfKM65ZbbuGbb77h5ptvzlo3ceJE1q5dS8eOHWnXrh0ffvjhBa+LjIwkKSmJ5ORkAB555BHGjRtHbGxsjj0DM1199dXcdttt9OjRg44dO/LPf/6TlJQUunXrRnp6OlFRUcTFxZ13bauwmjZtys0330y7du247bbbePnll7OaVW+//fbzrpfNmDGD22677bzXHzp0iGbNmvH2228zadIkmjVrRlJSEmCdQfbo4fnptMT1ngxfl5iYmBWsa0cPd5pDjh49RdWqf0+h8vTT87j44nI88MAVlC4dEC2sF4iPjycyMtLpMPxCSa2rxMREIiIKditJcTctBrIzZ87wwQcfUL58ee655x6nw/G6u+++m7i4OBo2bHje+ry+dxEREQXuFu63Z2Tu9lZMSjrL+PGLadlyGr/9tjNr/cSJnXnkkbYBm8SUUr5h4MCBJXI8y9TUVHr27HlBEvMEv/4rnldvxXPn0vnoo41MnLiMo0etASoXL95H1671vBihUqqkK126NHfeeafTYXhdaGgoffr08cq+/DqR5ZTEjDH88MM2xo5dTELCcQDatavJ+PGxREVd7O0QlVJKeZhfJ7KcTJu2gSee+B2ASy+tSFxcDDfccKmOxqFUDoKCgkhNTS2RTV/KGampqQQFFe9VLb9NZK7Xxs6eTcuaA+y225owdep6Bg68nP79W1CqVLBTISrl88qVK0dKSkqB5odKSkpya1QHpXWVk8wZoouT3yayU9d8w7Fjp3nppeX8+ON2li7tR3h4KSIiwliypJ/OzqyUG0SkwCMuHD58mDp19FYVd2hdeYfXei2KyLUi8oeIJIjI8ByeDxORr+3nl4tIvby29+abq7jiig9599117N6dxLx5u7Oe0ySmlFIlh1cSmYgEA5OB64BmQB8RaZat2EDguDGmIfAaMDGvbY4evYikpFS6dKnL/Pl9uf76Sz0RulJKKR/nlRuiRaQDEGeMucZefgbAGPOiS5k5dpmlIhICHASqGZcAXW+IVkopFXh8+YboWsAel+W99rocyxhj0oBEoIpXolNKKeW3/HZkD6WUUgq812txH+Dadae2vS6nMnvtpsUI4C/XAoU55VRKKRXYvHVGthKIFJH6IhIK3AnMzFZmJvBP+/FtwFzjTyMaK6WUcoRXEpl9zWsIMAfYAnxjjNkkIuNEpJdd7AOgiogkAGOBtsXVVT+QuXFbw+MisllENojIbyJyiRNx+or86sul3K0iYkSk6PNk+Cl36kpEetvfr00ikvsEWwHOjd9hXRH5XUTW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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# y_pred_class = eec.predict(X_test)\n",
    "# confusion_matrix(y_test, y_pred_class)\n",
    "y_pred = eec.predict_proba(X_test)[:, 1]\n",
    "plotROC(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:35:47.048950Z",
     "start_time": "2019-11-22T17:35:47.034439Z"
    }
   },
   "outputs": [],
   "source": [
    "def objectiveEasy(params):\n",
    "    time1 = time.time()\n",
    "    params = {\n",
    "        'base_estimator': params['base_estimator'](),\n",
    "        'sampling_strategy': params['sampling_strategy'],\n",
    "    }\n",
    "\n",
    "    print(\"\\n############## New Run ################\")\n",
    "    print(f\"params = {params}\")\n",
    "    FOLDS = 5\n",
    "    count = 1\n",
    "    skf = StratifiedKFold(n_splits=FOLDS, shuffle=True, random_state=42)\n",
    "    score_mean = 0\n",
    "    for tr_idx, val_idx in skf.split(X_train, y_train.values.ravel()):\n",
    "        clf = EasyEnsembleClassifier(**params,\n",
    "                                    random_state=0,\n",
    "                                    n_estimators=300,\n",
    "                                    n_jobs=-1,\n",
    "                                    verbose=0)\n",
    "\n",
    "        X_tr, X_vl = X_train.iloc[tr_idx, :], X_train.iloc[val_idx, :]\n",
    "        y_tr, y_vl = y_train.iloc[tr_idx], y_train.iloc[val_idx]\n",
    "        \n",
    "        clf.fit(X_tr, y_tr.values.ravel())\n",
    "        score = make_scorer(roc_auc_score, needs_proba=True)(clf, X_vl, y_vl)\n",
    "        score_mean += score\n",
    "        print(f'{count} CV - score: {round(score, 4)}')\n",
    "        count += 1\n",
    "    time2 = time.time() - time1\n",
    "    print(f\"Total Time Run: {round(time2 / 60,2)}\")\n",
    "    gc.collect()\n",
    "    print(f'Mean ROC_AUC: {score_mean / FOLDS}')\n",
    "    del X_tr, X_vl, y_tr, y_vl, clf, score\n",
    "    return -(score_mean / FOLDS)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-22T17:35:47.188149Z",
     "start_time": "2019-11-22T17:35:47.053258Z"
    }
   },
   "outputs": [],
   "source": [
    "spaceEasy = {\n",
    "    'base_estimator': hp.choice('base_estimator', [AdaBoostClassifier, \n",
    "                                                  DecisionTreeClassifier,\n",
    "                                                  BernoulliNB]),\n",
    "    'sampling_strategy': hp.choice('sampling_strategy', [0.7, 0.8, 0.9,'majority',\n",
    "                                                        'not minority','not majority',\n",
    "                                                        'all'])\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.148848Z",
     "start_time": "2019-11-22T17:35:47.190612Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                                                    \n",
      "############## New Run ################\n",
      "params = {'base_estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
      "                       max_features=None, max_leaf_nodes=None,\n",
      "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
      "                       min_samples_leaf=1, min_samples_split=2,\n",
      "                       min_weight_fraction_leaf=0.0, presort=False,\n",
      "                       random_state=None, splitter='best'), 'sampling_strategy': 0.7}\n",
      "1 CV - score: 0.6681                                \n",
      "2 CV - score: 0.7042                                \n",
      "3 CV - score: 0.658                                 \n",
      "4 CV - score: 0.6659                                \n",
      "5 CV - score: 0.6622                                \n",
      "Total Time Run: 6.33                                \n",
      "Mean ROC_AUC: 0.6716679846839447                    \n",
      "                                                                                 \n",
      "############## New Run ################\n",
      "params = {'base_estimator': BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True), 'sampling_strategy': 0.9}\n",
      "1 CV - score: 0.6577                                                             \n",
      "2 CV - score: 0.7253                                                             \n",
      "3 CV - score: 0.6809                                                             \n",
      "4 CV - score: 0.6933                                                             \n",
      "5 CV - score: 0.6652                                                             \n",
      "Total Time Run: 7.43                                                             \n",
      "Mean ROC_AUC: 0.6844764742149689                                                 \n",
      "                                                                                 \n",
      "############## New Run ################\n",
      "params = {'base_estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
      "                       max_features=None, max_leaf_nodes=None,\n",
      "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
      "                       min_samples_leaf=1, min_samples_split=2,\n",
      "                       min_weight_fraction_leaf=0.0, presort=False,\n",
      "                       random_state=None, splitter='best'), 'sampling_strategy': 'not minority'}\n",
      "1 CV - score: 0.6807                                                             \n",
      "2 CV - score: 0.7036                                                             \n",
      "3 CV - score: 0.6694                                                             \n",
      "4 CV - score: 0.6719                                                             \n",
      "5 CV - score: 0.6628                                                             \n",
      "Total Time Run: 6.3                                                              \n",
      "Mean ROC_AUC: 0.6776774763410994                                                 \n",
      "                                                                                 \n",
      "############## New Run ################\n",
      "params = {'base_estimator': BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True), 'sampling_strategy': 'all'}\n",
      "1 CV - score: 0.6576                                                             \n",
      "2 CV - score: 0.7254                                                             \n",
      "3 CV - score: 0.6809                                                             \n",
      "4 CV - score: 0.6935                                                             \n",
      "5 CV - score: 0.6651                                                             \n",
      "Total Time Run: 7.34                                                             \n",
      "Mean ROC_AUC: 0.684490306165839                                                  \n",
      "                                                                                 \n",
      "############## New Run ################\n",
      "params = {'base_estimator': BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True), 'sampling_strategy': 'not minority'}\n",
      "1 CV - score: 0.6576                                                            \n",
      "2 CV - score: 0.7254                                                            \n",
      "3 CV - score: 0.6809                                                            \n",
      "4 CV - score: 0.6935                                                            \n",
      "5 CV - score: 0.6651                                                            \n",
      "Total Time Run: 7.31                                                            \n",
      "Mean ROC_AUC: 0.684490306165839                                                 \n",
      "                                                                                \n",
      "############## New Run ################\n",
      "params = {'base_estimator': AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None, learning_rate=1.0,\n",
      "                   n_estimators=50, random_state=None), 'sampling_strategy': 0.8}\n",
      "1 CV - score: 0.6798                                                            \n",
      "2 CV - score: 0.7274                                                            \n",
      "3 CV - score: 0.6833                                                            \n",
      "4 CV - score: 0.7096                                                            \n",
      "5 CV - score: 0.6582                                                            \n",
      "Total Time Run: 16.15                                                           \n",
      "Mean ROC_AUC: 0.6916605628090979                                                \n",
      "                                                                                 \n",
      "############## New Run ################\n",
      "params = {'base_estimator': BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True), 'sampling_strategy': 0.8}\n",
      "1 CV - score: 0.6576                                                             \n",
      "2 CV - score: 0.7255                                                             \n",
      "3 CV - score: 0.6808                                                             \n",
      "4 CV - score: 0.6932                                                             \n",
      "5 CV - score: 0.6651                                                             \n",
      "Total Time Run: 7.33                                                             \n",
      "Mean ROC_AUC: 0.6844313280120199                                                 \n",
      "                                                                                 \n",
      "############## New Run ################\n",
      "params = {'base_estimator': BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True), 'sampling_strategy': 0.8}\n",
      "1 CV - score: 0.6576                                                             \n",
      "2 CV - score: 0.7255                                                             \n",
      "3 CV - score: 0.6808                                                               \n",
      "4 CV - score: 0.6932                                                               \n",
      "5 CV - score: 0.6651                                                               \n",
      "Total Time Run: 7.38                                                               \n",
      "Mean ROC_AUC: 0.6844313280120199                                                   \n",
      "                                                                                   \n",
      "############## New Run ################\n",
      "params = {'base_estimator': AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None, learning_rate=1.0,\n",
      "                   n_estimators=50, random_state=None), 'sampling_strategy': 'majority'}\n",
      "1 CV - score: 0.6773                                                               \n",
      "2 CV - score: 0.7275                                                               \n",
      "3 CV - score: 0.684                                                                \n",
      "4 CV - score: 0.7079                                                               \n",
      "5 CV - score: 0.6557                                                               \n",
      "Total Time Run: 15.98                                                              \n",
      "Mean ROC_AUC: 0.690480707798937                                                    \n",
      "                                                                                   \n",
      "############## New Run ################\n",
      "params = {'base_estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
      "                       max_features=None, max_leaf_nodes=None,\n",
      "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
      "                       min_samples_leaf=1, min_samples_split=2,\n",
      "                       min_weight_fraction_leaf=0.0, presort=False,\n",
      "                       random_state=None, splitter='best'), 'sampling_strategy': 'not majority'}\n",
      "1 CV - score: 0.5089                                                               \n",
      "2 CV - score: 0.5264                                                               \n",
      "3 CV - score: 0.5007                                                               \n",
      "4 CV - score: 0.5165                                                               \n",
      "5 CV - score: 0.5102                                                               \n",
      "Total Time Run: 32.65                                                              \n",
      "Mean ROC_AUC: 0.5125353659672314                                                   \n",
      "                                                                                     \n",
      "############## New Run ################\n",
      "params = {'base_estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
      "                       max_features=None, max_leaf_nodes=None,\n",
      "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
      "                       min_samples_leaf=1, min_samples_split=2,\n",
      "                       min_weight_fraction_leaf=0.0, presort=False,\n",
      "                       random_state=None, splitter='best'), 'sampling_strategy': 'not minority'}\n",
      "1 CV - score: 0.6807                                                                 \n",
      "2 CV - score: 0.7036                                                                 \n",
      "3 CV - score: 0.6694                                                                 \n",
      "4 CV - score: 0.6719                                                                 \n",
      "5 CV - score: 0.6628                                                                 \n",
      "Total Time Run: 6.35                                                                 \n",
      "Mean ROC_AUC: 0.6776774763410994                                                     \n",
      "                                                                                     \n",
      "############## New Run ################\n",
      "params = {'base_estimator': AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None, learning_rate=1.0,\n",
      "                   n_estimators=50, random_state=None), 'sampling_strategy': 'all'}\n",
      "1 CV - score: 0.6773                                                                \n",
      "2 CV - score: 0.7275                                                                \n",
      "3 CV - score: 0.684                                                                 \n",
      "4 CV - score: 0.7079                                                                \n",
      "5 CV - score: 0.6557                                                                \n",
      "Total Time Run: 15.93                                                               \n",
      "Mean ROC_AUC: 0.6904797767094012                                                    \n",
      "                                                                                    \n",
      "############## New Run ################\n",
      "params = {'base_estimator': AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None, learning_rate=1.0,\n",
      "                   n_estimators=50, random_state=None), 'sampling_strategy': 'not majority'}\n",
      "1 CV - score: 0.6826                                                                \n",
      "2 CV - score: 0.7051                                                                \n",
      "3 CV - score: 0.6815                                                                \n",
      "4 CV - score: 0.7072                                                                \n",
      "5 CV - score: 0.6586                                                                \n",
      "Total Time Run: 252.97                                                              \n",
      "Mean ROC_AUC: 0.6870057551851865                                                    \n",
      "                                                                                      \n",
      "############## New Run ################\n",
      "params = {'base_estimator': AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None, learning_rate=1.0,\n",
      "                   n_estimators=50, random_state=None), 'sampling_strategy': 'not minority'}\n",
      "1 CV - score: 0.6773                                                                  \n",
      "2 CV - score: 0.7275                                                                  \n",
      "3 CV - score: 0.684                                                                   \n",
      "4 CV - score: 0.7079                                                                  \n",
      "5 CV - score: 0.6557                                                                  \n",
      "Total Time Run: 15.98                                                                 \n",
      "Mean ROC_AUC: 0.690480707798937                                                       \n",
      "                                                                                      \n",
      "############## New Run ################\n",
      "params = {'base_estimator': AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None, learning_rate=1.0,\n",
      "                   n_estimators=50, random_state=None), 'sampling_strategy': 'not minority'}\n",
      "1 CV - score: 0.6773                                                                 \n",
      "2 CV - score: 0.7275                                                                 \n",
      "3 CV - score: 0.684                                                                  \n",
      "4 CV - score: 0.7079                                                                 \n",
      "5 CV - score: 0.6557                                                                 \n",
      "Total Time Run: 15.91                                                                \n",
      "Mean ROC_AUC: 0.690480707798937                                                      \n",
      "                                                                                     \n",
      "############## New Run ################\n",
      "params = {'base_estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
      "                       max_features=None, max_leaf_nodes=None,\n",
      "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
      "                       min_samples_leaf=1, min_samples_split=2,\n",
      "                       min_weight_fraction_leaf=0.0, presort=False,\n",
      "                       random_state=None, splitter='best'), 'sampling_strategy': 0.7}\n",
      "1 CV - score: 0.6681                                                                 \n",
      "2 CV - score: 0.7042                                                                 \n",
      "3 CV - score: 0.658                                                                  \n",
      "4 CV - score: 0.6659                                                                 \n",
      "5 CV - score: 0.6622                                                                 \n",
      "Total Time Run: 6.3                                                                  \n",
      "Mean ROC_AUC: 0.6716679846839447                                                     \n",
      "                                                                                     \n",
      "############## New Run ################\n",
      "params = {'base_estimator': BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True), 'sampling_strategy': 'not minority'}\n",
      "1 CV - score: 0.6576                                                                 \n",
      "2 CV - score: 0.7254                                                                 \n",
      "3 CV - score: 0.6809                                                                 \n",
      "4 CV - score: 0.6935                                                                 \n",
      "5 CV - score: 0.6651                                                                 \n",
      "Total Time Run: 7.26                                                                 \n",
      "Mean ROC_AUC: 0.684490306165839                                                      \n",
      "                                                                                     \n",
      "############## New Run ################\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "params = {'base_estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
      "                       max_features=None, max_leaf_nodes=None,\n",
      "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
      "                       min_samples_leaf=1, min_samples_split=2,\n",
      "                       min_weight_fraction_leaf=0.0, presort=False,\n",
      "                       random_state=None, splitter='best'), 'sampling_strategy': 0.8}\n",
      "1 CV - score: 0.6705                                                                 \n",
      "2 CV - score: 0.7079                                                                 \n",
      "3 CV - score: 0.6633                                                                 \n",
      "4 CV - score: 0.6732                                                                 \n",
      " 85%|████████▌ | 17/20 [7:20:02<1:24:28, 1689.64s/it, best loss: -0.6916605628090979]\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-31-cc7f4ef58750>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m             \u001b[0mspace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mspaceEasy\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m             \u001b[0malgo\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtpe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msuggest\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m             max_evals=20)\n\u001b[0m\u001b[1;32m      6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;31m# Print best parameters\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mfmin\u001b[0;34m(fn, space, algo, max_evals, trials, rstate, allow_trials_fmin, pass_expr_memo_ctrl, catch_eval_exceptions, verbose, return_argmin, points_to_evaluate, max_queue_len, show_progressbar)\u001b[0m\n\u001b[1;32m    420\u001b[0m                     show_progressbar=show_progressbar)\n\u001b[1;32m    421\u001b[0m     \u001b[0mrval\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcatch_eval_exceptions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcatch_eval_exceptions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 422\u001b[0;31m     \u001b[0mrval\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexhaust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    423\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mreturn_argmin\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    424\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mexhaust\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    274\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mexhaust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    275\u001b[0m         \u001b[0mn_done\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_evals\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mn_done\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mblock_until_done\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masynchronous\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    277\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrefresh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    278\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, N, block_until_done)\u001b[0m\n\u001b[1;32m    239\u001b[0m                     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    240\u001b[0m                         \u001b[0;31m# -- loop over trials and do the jobs directly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 241\u001b[0;31m                         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserial_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    242\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    243\u001b[0m                     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mserial_evaluate\u001b[0;34m(self, N)\u001b[0m\n\u001b[1;32m    139\u001b[0m                 \u001b[0mctrl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCtrl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcurrent_trial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    140\u001b[0m                 \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 141\u001b[0;31m                     \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mspec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mctrl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    142\u001b[0m                 \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    143\u001b[0m                     \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'job exception: %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/hyperopt/base.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, config, ctrl, attach_attachments)\u001b[0m\n\u001b[1;32m    854\u001b[0m                 \u001b[0mmemo\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmemo\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    855\u001b[0m                 print_node_on_error=self.rec_eval_print_node_on_error)\n\u001b[0;32m--> 856\u001b[0;31m             \u001b[0mrval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpyll_rval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    857\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    858\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-29-4aaa495309c1>\u001b[0m in \u001b[0;36mobjectiveEasy\u001b[0;34m(params)\u001b[0m\n\u001b[1;32m     22\u001b[0m         \u001b[0my_tr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_vl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtr_idx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mval_idx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m         \u001b[0mclf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_tr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_tr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     25\u001b[0m         \u001b[0mscore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmake_scorer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mroc_auc_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mneeds_proba\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX_vl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_vl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     26\u001b[0m         \u001b[0mscore_mean\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mscore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/imblearn/ensemble/_easy_ensemble.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m    294\u001b[0m         \u001b[0;31m# RandomUnderSampler is not supporting sample_weight. We need to pass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    295\u001b[0m         \u001b[0;31m# None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_samples\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/sklearn/ensemble/bagging.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, X, y, max_samples, max_depth, sample_weight)\u001b[0m\n\u001b[1;32m    377\u001b[0m                 \u001b[0mtotal_n_estimators\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    378\u001b[0m                 verbose=self.verbose)\n\u001b[0;32m--> 379\u001b[0;31m             for i in range(n_jobs))\n\u001b[0m\u001b[1;32m    380\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    381\u001b[0m         \u001b[0;31m# Reduce\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m    787\u001b[0m                 \u001b[0;31m# consumption.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    788\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 789\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    790\u001b[0m             \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    791\u001b[0m             \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    697\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    698\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 699\u001b[0;31m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    700\u001b[0m                 \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    701\u001b[0m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    637\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 638\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    639\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    633\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    634\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 635\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    637\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    549\u001b[0m             \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    550\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 551\u001b[0;31m                 \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    552\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m                 \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    297\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Set algoritm parameters\n",
    "bestEasy = fmin(fn=objectiveEasy,\n",
    "            space=spaceEasy,\n",
    "            algo=tpe.suggest,\n",
    "            max_evals=20)\n",
    "\n",
    "# Print best parameters\n",
    "bestEasy_params = space_eval(spacespaceEasy, bestEasy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.359150Z",
     "start_time": "2019-11-22T16:57:26.270Z"
    }
   },
   "outputs": [],
   "source": [
    "clf = EasyEnsembleClassifier(**bestEasy_params,\n",
    "                            random_state=0,\n",
    "                            n_estimators=300,\n",
    "                            n_jobs=-1,\n",
    "                            verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.361860Z",
     "start_time": "2019-11-22T16:57:26.275Z"
    }
   },
   "outputs": [],
   "source": [
    "# training roc\n",
    "y_train_pred = clf.predict_proba(X_train)[:,1]\n",
    "plotROC(y_train, y_train_pred)\n",
    "# test roc\n",
    "y_pred = clf.predict_proba(X_test)[:,1]\n",
    "plotROC(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.364917Z",
     "start_time": "2019-11-22T16:57:26.279Z"
    }
   },
   "outputs": [],
   "source": [
    "# fit all data\n",
    "clf.fit(X, y.values.ravel(), verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.367600Z",
     "start_time": "2019-11-22T16:57:26.284Z"
    }
   },
   "outputs": [],
   "source": [
    "y_pred = clf.predict_proba(X)[:, 1]\n",
    "plotROC(y, y_pred)\n",
    "roc_auc_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.369909Z",
     "start_time": "2019-11-22T16:57:26.290Z"
    }
   },
   "outputs": [],
   "source": [
    "# pridict\n",
    "result = pd.DataFrame()\n",
    "result['id'] = ids\n",
    "result['target'] = eec.predict_proba(testX)[:, 1]\n",
    "result.to_csv('../submissions/EasyEnsemble.csv', index=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Balanced Bagging Classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 简单尝试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.372424Z",
     "start_time": "2019-11-22T16:57:26.297Z"
    }
   },
   "outputs": [],
   "source": [
    "bc = BalancedBaggingClassifier(base_estimator=AdaBoostClassifier(),\n",
    "                              random_state=42,\n",
    "                              n_estimators=300,\n",
    "                              n_jobs=-1,\n",
    "                              verbose=1)\n",
    "bc.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.374423Z",
     "start_time": "2019-11-22T16:57:26.303Z"
    }
   },
   "outputs": [],
   "source": [
    "# training data\n",
    "plotROC(y_train, bc.predict_proba(X_train)[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.376592Z",
     "start_time": "2019-11-22T16:57:26.307Z"
    }
   },
   "outputs": [],
   "source": [
    "confusion_matrix(y_train, bc.predict(X_train))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.378911Z",
     "start_time": "2019-11-22T16:57:26.311Z"
    }
   },
   "outputs": [],
   "source": [
    "# test data\n",
    "y_pred_class = bc.predict(X_test)\n",
    "# balanced_accuracy_score(y_test, y_pred_class)\n",
    "confusion_matrix(y_test, y_pred_class)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.381156Z",
     "start_time": "2019-11-22T16:57:26.314Z"
    }
   },
   "outputs": [],
   "source": [
    "y_pred = bc.predict_proba(X_test)[:, 1]\n",
    "plotROC(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.382418Z",
     "start_time": "2019-11-22T16:57:26.320Z"
    }
   },
   "outputs": [],
   "source": [
    "def objectiveBalance(params):\n",
    "    time1 = time.time()\n",
    "    params = {\n",
    "        'base_estimator': params['base_estimator'](),\n",
    "        'sampling_strategy': params['sampling_strategy'],\n",
    "    }\n",
    "\n",
    "    print(\"\\n############## New Run ################\")\n",
    "    print(f\"params = {params}\")\n",
    "    FOLDS = 5\n",
    "    count = 1\n",
    "    skf = StratifiedKFold(n_splits=FOLDS, shuffle=True, random_state=42)\n",
    "    score_mean = 0\n",
    "    for tr_idx, val_idx in skf.split(X_train, y_train.values.ravel()):\n",
    "        clf = BalancedBaggingClassifier(**params,\n",
    "                                    random_state=0,\n",
    "                                    n_estimators=300,\n",
    "                                    n_jobs=-1,\n",
    "                                    verbose=0)\n",
    "\n",
    "        X_tr, X_vl = X_train.iloc[tr_idx, :], X_train.iloc[val_idx, :]\n",
    "        y_tr, y_vl = y_train.iloc[tr_idx], y_train.iloc[val_idx]\n",
    "        \n",
    "        clf.fit(X_tr, y_tr.values.ravel())\n",
    "        score = make_scorer(roc_auc_score, needs_proba=True)(clf, X_vl, y_vl)\n",
    "        score_mean += score\n",
    "        print(f'{count} CV - score: {round(score, 4)}')\n",
    "        count += 1\n",
    "    time2 = time.time() - time1\n",
    "    print(f\"Total Time Run: {round(time2 / 60,2)}\")\n",
    "    gc.collect()\n",
    "    print(f'Mean ROC_AUC: {score_mean / FOLDS}')\n",
    "    del X_tr, X_vl, y_tr, y_vl, clf, score\n",
    "    return -(score_mean / FOLDS)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.384309Z",
     "start_time": "2019-11-22T16:57:26.323Z"
    }
   },
   "outputs": [],
   "source": [
    "spaceBalance = spaceEasy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.385947Z",
     "start_time": "2019-11-22T16:57:26.326Z"
    }
   },
   "outputs": [],
   "source": [
    "# Set algoritm parameters\n",
    "bestBalance = fmin(fn=objectiveBalance,\n",
    "            space=spaceBalance,\n",
    "            algo=tpe.suggest,\n",
    "            max_evals=20)\n",
    "\n",
    "# Print best parameters\n",
    "bestBalance_params = space_eval(spaceBalance, bestBalance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.387277Z",
     "start_time": "2019-11-22T16:57:26.330Z"
    }
   },
   "outputs": [],
   "source": [
    "clf = BalancedBaggingClassifier(**bestBalance_params,\n",
    "                                random_state=0,\n",
    "                                n_estimators=300,\n",
    "                                n_jobs=-1,\n",
    "                                verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.388965Z",
     "start_time": "2019-11-22T16:57:26.336Z"
    }
   },
   "outputs": [],
   "source": [
    "# training roc\n",
    "y_train_pred = clf.predict_proba(X_train)[:,1]\n",
    "plotROC(y_train, y_train_pred)\n",
    "# test roc\n",
    "y_pred = clf.predict_proba(X_test)[:,1]\n",
    "plotROC(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.390917Z",
     "start_time": "2019-11-22T16:57:26.341Z"
    }
   },
   "outputs": [],
   "source": [
    "# train with all data\n",
    "clf.fit(X, y.values.ravel(), verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.392861Z",
     "start_time": "2019-11-22T16:57:26.344Z"
    }
   },
   "outputs": [],
   "source": [
    "y_pred = clf.predict_proba(X)[:, 1]\n",
    "plotROC(y, y_pred)\n",
    "roc_auc_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T00:56:27.394798Z",
     "start_time": "2019-11-22T16:57:26.348Z"
    }
   },
   "outputs": [],
   "source": [
    "result = pd.DataFrame()\n",
    "result['id'] = ids\n",
    "result['target'] = bc.predict_proba(testX)[:, 1]\n",
    "result.to_csv('../submissions/BalancedBaggingClassifier.csv', index=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "file_extension": ".py",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "mimetype": "text/x-python",
  "name": "python",
  "npconvert_exporter": "python",
  "pygments_lexer": "ipython3",
  "toc": {
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "490px",
    "left": "1060.93px",
    "top": "54px",
    "width": "305.067px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "version": 3
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
